Только что написал пост об этом:
Несколько кнопок отправки с ASP.NET MVC :
В основном вместо ActionMethodSelectorAttribute
я использую
ActionNameSelectorAttribute
, что позволяет мне притворяться, что имя действия - это то, что я хочу. К счастью, ActionNameSelectorAttribute
не просто заставляет меня указывать имя действия, но я могу выбрать, соответствует ли текущее действие запросу.
Итак, у меня есть класс (кстати, я не слишком люблю это имя):
public class HttpParamActionAttribute : ActionNameSelectorAttribute {
public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) {
if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase))
return true;
if (!actionName.Equals("Action", StringComparison.InvariantCultureIgnoreCase))
return false;
var request = controllerContext.RequestContext.HttpContext.Request;
return request[methodInfo.Name] != null;
}
}
Чтобы использовать, просто определите форму следующим образом:
<% using (Html.BeginForm("Action", "Post")) { %>
<!— …form fields… -->
<input type="submit" name="saveDraft" value="Save Draft" />
<input type="submit" name="publish" value="Publish" />
<% } %>
и контроллер с двумя методами
public class PostController : Controller {
[HttpParamAction]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SaveDraft(…) {
//…
}
[HttpParamAction]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Publish(…) {
//…
}
}
Как видите, атрибут вообще не требует от вас указывать что-либо. Кроме того, названия кнопок переводятся непосредственно в имена методов. Кроме того (я не пробовал это), они должны работать как обычные действия, так что вы можете публиковать сообщения на любой из них
непосредственно.