代码之家  ›  专栏  ›  技术社区  ›  Gautam Jain

ASP.NET MVC-具有相同值的提交按钮

  •  2
  • Gautam Jain  · 技术社区  · 16 年前

    我有一个具有多个具有相同值的提交按钮的表单。示例:“继续”。

    现在,在ASP.NET MVC的post-controller方法中,如何知道按下了哪个按钮?

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult DepartmentDetails(string submitButton)
    

    SubmitButton的值将始终为“继续”。我怎么知道按了哪个按钮。

    我为每个按钮提供了单独的ID。

    谢谢。

    3 回复  |  直到 13 年前
        1
  •  4
  •   m3kh    16 年前

    试试这个:

    <% using (Html.BeginForm())
       { %>
       <input type="submit" value="Submit" name="Submit1Button" />
       <input type="submit" value="Submit" name="Submit2Button" />
    <%} %>
    

    public class HomeController : Controller
    {
    
        public ActionResult Index()
        {
            return View();
        }
    
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Index(FormCollection values)
        {
            string buttonName = values.AllKeys.Where((n) => n.EndsWith("Button")).SingleOrDefault();
            return View();
        }
    
    }
    
        2
  •  2
  •   Mark Gibaud    16 年前

    把你的页面分成两种不同的形式会不会更有意义?

    然后,可以使用html.begininform htmlhelper方法的参数为每个表单指定不同的控制器操作方法。

        3
  •  0
  •   Gaz    13 年前

    我知道这个问题由来已久,但刚碰到它,我想我会回答的!

    这就是我们使用的:

    /// <summary>
    /// Attribute for Controller methods to decide whether a particular button
    /// was clicked and hence whether the method can handle the action.
    /// </summary>
    public class IfButtonClickedAttribute : ActionMethodSelectorAttribute
    {
        private readonly IEnumerable<string> _buttonNames;
    
        public IfButtonClickedAttribute(params string[] buttonNames)
        {
            _buttonNames = buttonNames;
        }
    
        public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
        {
            if (controllerContext.HttpContext.Request.HttpMethod != "POST")
                return false;
    
            foreach (string buttonName in _buttonNames)
            {
                //this first test is for buttons or inputs that have the actual name specified
                if (controllerContext.HttpContext.Request.Form[buttonName] != null)
                    return true;
            }
    
            return false;
        }
    }
    

    然后在你的行动中:

    [ActionName("SaveItem"), IfButtonClicked("SaveAsDraft")]
    public ActionResult SaveAsDraft(){ ... }
    
    [ActionName("SaveItem"), IfButtonClicked("SaveAsPublished")]
    public ActionResult SaveAsPublished(){ ... }