Один из вариантов курса - иметь отдельные формы для каждой кнопки. Это часто невозможно или просто без Javascript или деформированного HTML. Это позволяет легко отправлять каждый запрос на другой метод действия.
Это решение, которое я придумал для нескольких кнопок отправки изображений. Я не особенно доволен этим, но он работает, и его можно легко рефакторизовать позже, если в фреймворк встроена альтернатива.
В вашем HTML:
<%= Html.SubmitImage("Dog", "~/images/dog.jpg")%>
<%= Html.SubmitImage("Cat", "~/images/cat.jpg")%>
В методе действия контроллера для формы:
(Это метод действия. Вам решать, как реализовать каждую кнопку)
public ActionResult Index(FormCollection form)
{
// get the name of the button that was clicked (sent via either Dog.x or Cat.x since its an image button)
var buttonName = form.GetSubmitButtonName();
if (buttonName == "Remove" || buttonName == "Skip")
{
Remove(form);
}
else if (buttonName == "Add")
{
Add(form);
}
}
Метод расширения:
(Это находит параметр формы с именем Remove.x или Skip.x или Add.x и удаляет часть .x)
public static class FormCollectionExtensions
{
public static string GetSubmitButtonName(this FormCollection formCollection)
{
var button = formCollection.Keys.OfType<string>().Where(x => x.EndsWith(".x")).SingleOrDefault();
// we got something like AddToCart.x
if (button != null)
{
return button.Substring(0, button.Length - 2);
}
throw new ApplicationException("No image button found");
}
}
Примечание. Один из вариантов - использовать CSS для наложения фонового изображения на обычный тип кнопки Html.SubmitButton (обычная кнопка HTML вместо кнопки изображения HTML), но я не нашел это удовлетворительным для меня из-за различий как ведут себя разные браузеры ( см. этот вопрос ).