How do you handle multiple submit buttons in ASP.NET MVC Framework?

后端 未结 30 3088
一个人的身影
一个人的身影 2020-11-21 07:16

Is there some easy way to handle multiple submit buttons from the same form? For example:

<% Html.BeginForm(\"MyAction\", \"MyController\", FormMethod.Pos         


        
30条回答
  •  我寻月下人不归
    2020-11-21 07:29

    Modified version of HttpParamActionAttribute method but with a bug fix for not causing an error on expired/invalid session postbacks. To see if this is a problem with your current site, open the your form in a window and just before you go to click Save or Publish, open a duplicate window, and logout. Now go back to your first window and try to submit your form using either button. For me I got an error so this change solves that problem for me. I omit a bunch of stuff for the sake of brevity but you should get the idea. The key parts are the inclusion of ActionName on the attribute and making sure the name passed in is the name of the View that shows the form

    Attribute Class

    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public class HttpParamActionAttribute : ActionNameSelectorAttribute
    {
        private readonly string actionName;
    
        public HttpParamActionAttribute(string actionName)
        {
            this.actionName = actionName;
        }
    
        public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
        {
            if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase))
                return true;
    
            if (!actionName.Equals(this.actionName, StringComparison.InvariantCultureIgnoreCase))
                return false;
    
            var request = controllerContext.RequestContext.HttpContext.Request;
            return request[methodInfo.Name] != null;
        }
    }
    

    Controller

    [Authorize(Roles="CanAddContent")]
    public ActionResult CreateContent(Guid contentOwnerId)
    {
        var viewModel = new ContentViewModel
        {
            ContentOwnerId = contentOwnerId
            //populate rest of view model
        }
        return View("CreateContent", viewModel);
    }
    
    [Authorize(Roles="CanAddContent"), HttpPost, HttpParamAction("CreateContent"), ValidateAntiForgeryToken]
    public ActionResult SaveDraft(ContentFormModel model)
    {
        //Save as draft
        return RedirectToAction("CreateContent");
    }
    
    [Authorize(Roles="CanAddContent"), HttpPost, HttpParamAction("CreateContent"), ValidateAntiForgeryToken]
    public ActionResult Publish(ContentFormModel model)
    {
        //publish content
        return RedirectToAction("CreateContent");
    }
    

    View

    @using (Ajax.BeginForm("CreateContent", "MyController", new { contentOwnerId = Model.ContentOwnerId }))
    {
        @Html.AntiForgeryToken()
        @Html.HiddenFor(x => x.ContentOwnerId)
    
        
        
        
    }
    

提交回复
热议问题