Моим решением было сделать две вещи. Скажем, у нас есть кнопка Сохранить и еще одна кнопка Добавить что-то. Когда пользователь нажимает кнопку Сохранить, мы хотим, чтобы проверка клиента и проверка сервера выполнялись. Для более поздней кнопки мы не хотим никакой проверки.
- Временно отключить проверку клиента для второй кнопки (при нажатии):
Хорошо, что когда JavaScript отключен, проверка клиента в любом случае никогда бы не состоялась.
- Позаботьтесь о стороне сервера
Подобно тому, что говорит Брайан, когда вы нажимаете любую кнопку отправки в форме, публикуется вся форма и значение нажатой кнопки отправки. Вы можете определить, какая кнопка была нажата по названию. В приведенном выше примере, когда пользователь нажимает кнопку «Сохранить» и мы читаем Request.Form [«submit-button»] в действии контроллера, мы получаем «Сохранить». Если пользователь нажмет «Добавить что-то», мы получим «Добавить что-то». Именно так должен работать HTML.
Теперь, чтобы обойти магические строки повсюду, у меня обычно есть открытый статический класс в контроллере, например:
public class HomeController
{
public static class Buttons
{
public const string Save = "Save";
public const string AddSomething = "Add something";
}
// Action methods
}
Таким образом, вы можете использовать их для рендеринга формы:
<input type="submit" name="submit-button" value="@HomeController.Buttons.Save" />
И вы можете легко прочитать нажатие кнопки в контроллере:
[HttpPost]
public ActionResult Index(Model viewModel)
{
var buttonClicked = Request.Form["submit-button"];
switch (buttonClicked) {
case HomeController.Buttons.Save:
return Save(viewModel);
case HomeController.Buttons.AddSomething:
return AddSOmething(viewModel);
}
return View();
}
В методе Save вы сначала спрашиваете, если ModelState.IsValid, и возвращаете модель представления, если нет, но в методе AddSomething мы устраняем любые ошибки:
public ActionResult AddSomething(Model viewModel)
{
ModelState.Clear();
// your code to add something to model
return View(viewModel);
}
Это вы содержали все в чистоте, порядке и проверяемости. И вы можете ввести константу для атрибута html-имени кнопки submit. Можно также сделать все константы с T4MVC. Аналогичное решение применимо для случаев, когда вам нужно поле со списком «auto postback», за исключением того, что вам нужно скрытое поле, которое устанавливается с помощью события onchange элемента select.
Надеюсь, это поможет.