:::: MENU ::::

Thursday, April 12, 2012

Note: I am uses this method over the previous post as I think it is cleaner.


Firstly, you can disable client validation on your cancel button simply by adding the CSS class 'cancel' to it. See: Disable client-side validation in MVC 3 "cancel" submit button

Secondly, as well as switching on the submit element's form name as described above, you can use a custom action selector. Here's mine, which I originally took from the blog post shown in the comment:

 /// <summary>
/// Used to vary an action method based on which button in a form was pressed. This
/// is useful but is an anti-pattern because it couples the controller to names
/// used in the form elements.
/// </summary>
/// <remarks>
/// See the example at http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx
/// </remarks>
public class AcceptButtonAttribute : ActionMethodSelectorAttribute
{
   
public string ButtonName { get; set; }

   
public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
   
{
       
var req = controllerContext.RequestContext.HttpContext.Request;
       
return !string.IsNullOrEmpty(req.Form[this.ButtonName]);
   
}
}

In your controller:

     [HttpPost]
   
[ActionName("Edit")]
   
[AcceptButton(ButtonName = "Cancel")]
   
public ActionResult Edit_Cancel(MyModel model)
   
{
       
return RedirectToAction("Index");
   
}

   
[HttpPost]
   
[AcceptButton(ButtonName = "Save")]
   
public ActionResult Edit(MyModel model)
   
{
       
// do real work here
   
}

Note that you need the [ActionName("Edit")] attribute to tell MVC that although using a different method name, it is for the Edit action.

And in your View:

     <input type="submit" name="Save" value="Save" />
   
<input type="submit" name="Cancel" value="Cancel" class="cancel" />
 
 More