Краткая версия: требуется ViewUserControl (например, форма входа), чтобы отправлять сообщения самому себе и иметь возможность перенаправлять (например, при успешном входе в систему) или возвращать исходное представление (например, Home / Index) с сводкой проверки и не мешать другим ViewUserControls на странице.
Кроме того, HomeController / Index должен иметь минимальные знания о внутренней работе формы входа. В идеале все, что требуется - это Html.RenderAction («Логин», «Пользователь») или аналогичный.
На данный момент застрял на перенаправлении с указанием «Дочерним действиям не разрешено выполнять действия перенаправления». Я знаю почему, но мне интересно, есть ли способ или другой способ сделать это.
Подробная информация о том, чего я пытаюсь достичь:
- инкапсулировать форму входа (или любую другую) для повторного использования на сайте
- отправить себе
- при сбое входа / проверки показать исходную страницу со сводкой проверки
- (some might argue to just post to Login Page and show Validation Summary there; if what I'm trying to achieve isn't possible, I will just go that route)
- при успешном входе в систему перенаправьте в / App / Home / Index
- также хочу:
- stick to PRG principles
- avoid ajax
- keep Login Form (UserController.Login()) as encapsulated as possible; avoid having to implement HomeController.Login() since the Login Form might appear elsewhere
Все, кроме редиректа, работает. До сих пор мой подход был таков:
Home/Index
включает форму входа:<%Html.RenderAction("Login","User");%>
User/Login ViewUserControl<UserLoginViewModel>
включает:
using(Html.BeginForm()){}
- includes hidden form field
"userlogin"="1"
public class UserController : BaseController {
...
[AcceptPostWhenFieldExists(FieldName = "userlogin")]
public ActionResult Login(UserLoginViewModel model, FormCollection form){
if (ModelState.IsValid) {
if(checkUserCredentials()) {
setUserCredentials()
return this.RedirectToAction<Areas.App.Controllers.HomeController>(x => x.Index());
}
else {
return View();
}
}
...
}
Отлично работает, когда: ModelState или User Credentials не работают - return View () уступает Home / Index и отображает соответствующую сводку проверки.
(У меня есть регистрационная форма на той же странице, с использованием той же структуры. Сводка проверки каждой формы отображается только тогда, когда эта форма отправлена.)
Не выполняется, когда: состояние модели и учетные данные пользователя действительны - RedirectToAction ‹› () дает следующую ошибку:
«Дочерним действиям не разрешено выполнять действия перенаправления».
Похоже, что во времена классических ASP это было бы решено с помощью Response.Buffer=True
. Есть ли сейчас эквивалентный параметр или обходной путь?
Кстати, работает: ASP.Net 4, MVC 2, VS 2010, веб-сервер для разработки / отладки
Надеюсь, все это имеет смысл.
Итак, какие у меня варианты? Или где я ошибаюсь в своем подходе? тиа!