如何在ASP.NET MVC中根据点击的按钮更改表单提交的操作?

4
我有一个表单,看起来像这个模型(从Facebook的Photoshop)。我们ASP.NET MVC网站上的消息视图需要“标记为未读”和“删除”功能。我正在尝试弄清楚如何使用HTML表单来实现此操作。如何使“标记为未读”提交到一个表单URL,“删除”提交到不同的URL?如果点击“标记为未读”,我希望它将表单提交到“/Messages/MarkUnread”,如果是“删除”按钮,则将其提交到“/Messages/Delete”。我想在没有JavaScript的情况下让它工作,一旦完成,我会添加jQuery表单插件,以便在启用JS时进行ajax提交,否则将进行正常的表单提交。
3个回答

4

我是一个完全不懂MVC的新手,但我认为表单只能提交到一个动作。

话虽如此,在你POST到的动作中,我知道你将能够知道哪个按钮被点击并适当地处理事情,例如:

    [AcceptVerbs(HttpVerbs.Post)]
    public ViewResult Index(string btnCompose, string btnMarkAsRead, string btnDelete)
    {
        if (btnCompose != null)
        {
            // Compose was clicked, handle appropriately
        }
        else if (btnMarkAsRead != null)
        {
            // Mark As Read was clicked, handle appropriately
        }
        else if (btnDelete != null)
        {
            // Delete was clicked, handle appropriately
        }
    }

这里假设你的HTML元素名称为 "btnDelete" 等。

1

正如Josh所说,对于没有JavaScript的情况下,一个表单只能执行一项操作。 提交元素(或按钮元素)可以具有相同的名称但不同的值,以便你知道哪个被按下了。 对于不同的操作,你可以创建一个操作,根据按钮按下的值处理请求,或将表单数据放入TempData字典中,并根据按下的按钮返回RedirectToAction()。 最后一个方法将是后续通过ajax实现的良好起点。


0

Josh是正确的,在MVC中,如果没有JavaScript,一个表单等于一个操作

您可以使用Josh的操作和一个修饰符,将FormCollection作为参数添加进去。您只需要确保每个复选框都有一个唯一的名称,并且易于识别。例如:如果消息ID是20,则将CheckBox名称设置为chk20

[AcceptVerbs(HttpVerbs.Post)]
public ViewResult Index(string btnCompose, string btnMarkAsRead, string btnDelete, FormCollection formCollection)
{
  if (btnCompose != null)
  {
    //Return the compose View
  }
  else if (btnMarkAsRead != null)
  {
    // Mark As Read was clicked, handle appropriately
    //Loop through every key in the collection looking for stuff that starts with chk
    foreach (string key in formCollection.Keys)
    {
      if (key.StartsWith("chk"))
      {
        //Do Mark Read Here
      }
    }
  }
  else if (btnDelete != null)
  {
   //Loop through every key in the collection looking for stuff that starts with chk
    foreach (string key in formCollection.Keys)
    {
      if (key.StartsWith("chk"))
      {
        //Do Mark Delete Here
      }
    }
  }
}

这样的方法可能有效...你需要尝试一下才能确定。我会使用jQuery,并自己构建一个正确操作的后台请求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接