Запретить пользователю использовать функции браузера "вперед-назад", используя MVC 3, C# и unobtrusive-ajax
Проблема: не позволяет пользователю использовать функции браузера вперед и назад.
Использование: MVC 3 C# Microsoft Visual Studio 2010 .NET Framework 4.0 unobtrusive-ajax
У меня есть работающее приложение MVC3, использующее Html.BeginForm и друзей обычным способом, с методами контроллера, принимающими различные объекты модели в качестве параметров и так далее. Все работает отлично, за исключением того, что пользователь может препятствовать ожидаемому потоку функциональных возможностей, используя возможности обратной и обратной навигации браузера. Крайне важно, чтобы это не было возможно в данном конкретном случае.
До сих пор я "решил" проблему, используя самодельный FSM (конечный автомат), который перехватывает попытки выбрать действия, несовместимые с состоянием пользователя, отправив ее обратно в начало приложения с сообщением, что она не может использовать навигацию браузера. Это действительно не очень удобно для пользователя:-)
Сейчас я пытаюсь использовать ненавязчивый Ajax для решения моей проблемы (Ajax.BeginForm). Все работает нормально, пока я не попытаюсь привести данные модели назад и вперед, как при использовании Html.BeginForm. У меня есть много существующего программного кода вокруг проверки модели и на стороне сервера с использованием view/viewmodel/CustomValidation, которое я хочу сохранить в возможном варианте решения Ajax.
Этот стартовый шлетон работает прекрасно (детали удалены):
CommandDispatcher.cshtml Просмотр:
@using (Ajax.BeginForm("CommandDispatcher", "Adm", new AjaxOptions{ UpdateTargetId = "result" }))
{
<div id="result">
@Html.Partial("SomeAction001") @* Only run the first time *@
</div>
}
SomeAction001.cshtml частичное представление:
<input type="submit" id="SomeAction001" name="SomeAction001" value="SomeAction001" />
SomeAction002.cshtml частичное представление:
<input type="submit" id="SomeAction002" name="SomeAction002" value="SomeAction002" />
контроллер:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult StartCommandDispatcher()
{
return View("CommandDispatcher");
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CommandDispatcher()
{
string action = translateToAction(Request);
return findPartialView(action);
}
private static string translateToAction(HttpRequestBase request)
{
string action = <find out which push button has been pressed and translate that to a known action>;
return action;
}
private ActionResult findPartialView(string action)
{
string partialViewName = <look up a dictionary or something>;
ActionResult ar = PartialView(partialViewName);
return ar;
}
Чтобы этот сценарий работал и с данными в нем:-), мне нужно добавить функциональность рендеринга и проверки модели.
Отправка модели в браузер не является проблемой, примером чего является следующее дополнение к частичному представлению: @Html.Raw((model as MyViewModel).Field1)
который делает, как надеялись и ожидали. Я думаю, что проблема в направлении от браузера к контроллеру.
Как я могу представить такую функциональность?