Мне интересно, как вы можете реализовать несколько действий формы при отправке формы в asp.net mvc 3 RC.
Если я редактирую пользователя, например, я хотел бы иметь панель действий со следующими кнопками:
"Сохранить" | "Сохранить и закрыть" | "Отменить"
Сохранить. Отправляет форму и сохраняет ее, возвращая вас на экран редактирования. Может быть легко реализована как стандартная кнопка ввода/отправки. Здесь ничего особенного.
Код контроллера для этого может выглядеть как
public ActionResult Edit(UserViewModel model)
{
...
return RedirectToAction("Edit", model.Id");
}
Отмена - просто возвращает вас на предыдущий экран. Я думал об использовании тега привязки для этого.
<a href="@Request.UrlReferrer" class="button">Cancel</a>
Но я не понимаю, как реализовать "Сохранить и закрыть" , когда вам нужно отправить те же данные формы. Мне было интересно, может ли быть нулевым близким параметром?
public ActionResult Edit(UserViewModel model, bool? close)
{
...
return close.GetValueOrDefault(false) ? RedirectToAction("Index", model.Id" : RedirectToAction("Edit", model.Id");
}
Но как мне отправить этот дополнительный параметр вместе с формой в этом случае?
Если возможно, я хотел бы иметь одно действие формы для обработки отправки как в вышеупомянутом макете.
Мне также интересно, если кто-то еще придумал хорошую модель взаимодействия с пользователем вокруг этой идеи.
Решение
В итоге я использовал предложение Omar, но вместо того, чтобы передавать строку, я взял перечисление, поэтому мне не нужно выполнять строковые проверки во всех моих контроллерах.
public ActionResult Edit(UserViewModel model, FormAction actionType)
{
// pre-check
if (actionType == FormAction.Cancel)
// just return user to previous view and don't save.
// Save code
if (actionType == FormAction.Save)
return ...
else if (actionType == FormAction.SaveAndClose)
....
}
Поскольку мне нужен более дружественный текст "Сохранить и закрыть" на кнопке <input>
, но я хотел использовать перечисление, я внедрил собственный ModelBinder для FormAction, который провел синтаксический анализ.
Я не использовал тег <button>
, потому что теги уже были на месте для тегов <input>
.