Короткая версия: нужен ViewUserControl (т. Е. Форма входа), чтобы публиковать сообщения для себя и иметь возможность перенаправлять (т. Е. При успешном входе в систему) или возвращать исходный вид (т. Е. Home / Index) со сводкой проверки, а не мешать другим ViewUserControls на странице.
Кроме того, HomeController / Index должен иметь минимальные знания о внутренней работе формы входа. В идеале, Html.RenderAction («Логин», «Пользователь») или аналогичный - это все, что требуется.
В данный момент застрял на перенаправлении, дающем «Дочерним действиям не разрешено выполнять действия перенаправления». Я знаю почему, но мне интересно, есть ли способ обойти это или как-то еще, как мне следует это делать.
Детали того, чего я пытаюсь достичь:
- инкапсулирует форму входа (или любую) для повторного использования на сайте
- пост для себя
- при неудачном входе в систему / проверке показать исходную страницу с Сводной информацией о проверке
- (некоторые могут поспорить, чтобы просто опубликовать на странице входа в систему и показать там Сводную информацию о проверке; если то, что я пытаюсь достичь, невозможно, я просто пойду по этому пути)
- при успешном входе в систему перенаправьте в / App / Home / Index
- также хочу:
- придерживаться принципов PRG
- сохранить форму входа (UserController.Login ()) как можно более инкапсулированной; Избегайте реализации HomeController.Login (), так как форма входа может появиться в другом месте
Все, кроме перенаправления, работает. Мой подход до сих пор был:
Home/Index
включает регистрационную форму: <%Html.RenderAction("Login","User");%>
User/Login ViewUserControl<UserLoginViewModel>
включает в себя:
using(Html.BeginForm()){}
- включает скрытое поле формы
"userlogin"="1"
public class UserController : BaseController {
...
[AcceptPostWhenFieldExists(FieldName = "userlogin")]
public ActionResult Login(UserLoginViewModel model, FormCollection form){
if (ModelState.IsValid) {
if(checkUserCredentials()) {
setUserCredentials()
<b>return this.RedirectToAction<Areas.App.Controllers.HomeController>(x => x.Index());</b>
}
else {
<b>return View();</b>
}
}
...
}
Отлично работает при : сбой учетных данных ModelState или пользователя - return View () уступает Home / Index и отображает соответствующую сводку проверки.
(У меня есть форма регистрации на той же странице, использующая ту же структуру. Сводка проверки каждой формы отображается только при отправке этой формы.)
Сбой при : действительные учетные данные ModelState и пользователя - RedirectToAction <> () выдает следующую ошибку:
«Дочерним действиям запрещено выполнять действия перенаправления.»
Похоже, что в классические дни ASP это было бы решено с помощью Response.Buffer=True
. Есть ли эквивалентная настройка или обходной путь сейчас?
Кстати, работает: ASP.Net 4, MVC 2, VS 2010, Dev / Debugging Web Server
Надеюсь, все это имеет смысл.
Итак, каковы мои варианты? Или где я иду не так в моем подходе? ТИА!