【问题标题】:How can I change the action a form submits to based on what button is clicked in ASP.NET MVC?如何根据在 ASP.NET MVC 中单击的按钮更改表单提交的操作?
【发布时间】:2010-12-30 21:43:45
【问题描述】:

对于我们的 ASP.NET MVC 网站上的 Messages 视图,我有一个类似于以下模型的表单(从 Facebook 上的照片)。

我希望让“标记为未读”和“删除”功能适用于这样的表单。我正在尝试弄清楚如何使用 html 表单来做到这一点。

如何将“标记为未读”提交到一个表单网址,而“删除”将相同的表单提交到另一个网址?

如果您点击“标记为未读”,我希望它提交表单到“/Messages/MarkUnread”,如果它是“删除”按钮,我希望它提交表单到“/消息/删除”。

我想在没有 javascript 的情况下让它工作,一旦它完成,我将添加 jQuery 表单插件,这样如果启用了 JS,它将执行 ajax 提交,否则它将执行正常的表单发布。

【问题讨论】:

    标签: c# html asp.net-mvc webforms


    【解决方案1】:

    我是一个完全的 MVC 新手,但我相信表单只能提交一个操作。

    也就是说,在您发布到的操作中,我知道您将能够判断单击了哪个按钮并适当地处理事情,例如:

        [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”等。

    【讨论】:

      【解决方案2】:

      正如 josh 所说,一种形式 - 一种无需 javascript 的操作。 提交元素(或按钮元素)可以具有相同的名称但不同的值,以便您知道 wic 一个被按下。 对于不同的操作,您可以根据按下的按钮进行处理请求的操作,或者您可以将表单数据放入 TempData 字典并根据按钮按下的值返回 RedirectToAction()。 最后一个将是以后 ajaxifying 的一个很好的起点。

      【讨论】:

        【解决方案3】:

        Josh 是正确的,在 MVC 中,没有 JavaScript,一种形式 = 一种操作

        您可以将 Josh 的操作与一个修饰符一起使用,添加 FormCollection 作为参数。您只需要确保每个复选框都有一个唯一的名称,并且易于识别。 IE:如果 Message 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,并自己构建一个返回正确操作的帖子。

        【讨论】:

          猜你喜欢
          • 2013-07-13
          • 2014-02-02
          • 1970-01-01
          • 2010-09-23
          • 2013-05-05
          • 1970-01-01
          • 1970-01-01
          • 2013-01-16
          • 2016-08-03
          相关资源
          最近更新 更多