2

Короткий verion: требуется ViewUserControl (т. Е. Форма входа в систему), чтобы отправлять сообщения в self и иметь возможность перенаправлять (т. Е. При успешном логин) или вернуть исходный вид (т. е. Home/Index) с сводкой проверки и не вмешиваться в другие ViewUserControls на странице.Как я могу инкапсулировать форму/сообщение/проверку [/ redirect] в ViewUserControl в ASP.Net MVC 2

Кроме того, HomeController/Index должен иметь минимальное знание внутренней работы входа в систему. В идеале, Html.RenderAction («Вход», «Пользователь») или аналогичный, это все, что требуется.

На данный момент застрял в перенаправлении, давая «Действиям ребенка не разрешено выполнять действия перенаправления». Я знаю почему, но задаюсь вопросом, есть ли способ, или иначе я должен это делать.

Детали того, что я пытаюсь достичь:

  • encapsulate a Login (or any) Form to be reused across site
  • post to self
  • when Login/validation fails, show original page with Validation Summary
    • (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)
  • when Login succeeds, redirect to /App/Home/Index
  • also, want to:
    • 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 includes Login Form: <%Html.RenderAction("Login","User");%>
  • User/Login ViewUserControl<UserLoginViewModel> includes:
    • 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 или учетные данные пользователя не в состоянии - вернуть View() не уступает Home/Index и отображает резюме соответствующих проверки.

(у меня есть Регистр формы на той же странице, используя ту же самую структуру резюме проверки Каждая форма показывает только тогда, когда эта форма представляется.).

Сбой при: ModelState и учетные данные пользователя действительно - RedirectToAction < >() дает следующую ошибку:
«Действия ребенка не могут выполнять перенаправленные действия».

Похоже, что в классические ASP-дни это было бы решено с помощью Response.Buffer=True. Есть ли эквивалентная настройка или обходной путь сейчас?

Btw, бег: ASP.Net MVC 4, 2, VS 2010, Dev/Отладка веб-сервера

Я надеюсь, что все это имеет смысл.

Итак, какие у меня варианты? Или где я ошибаюсь в своем подходе? ТИА!

+0

эти две другие сообщения охватывают связанные проблемы, но решения не работают или не соответствуют моим критериям (если это возможно): http://stackoverflow.com/questions/2056421/why-are -redirect-results-not-allowed-in-child-actions-in-asp-net-mvc-2 http://stackoverflow.com/questions/2022182/render-action-return-view-form-problem – paul

ответ

0

Я бы пошел с частичным представлением (например, «_Login.cshtml» или «_Login.ascx»), которое можно поместить на MasterPage/_Layout. Внутри частичного представления вы пишете тег формы, который отправляется в Action на контроллере (скажем, «AuthController» и действие «LogIn»). Для того, чтобы вспомнить, где вы пришли

Это как действие может выглядеть следующим образом:

public ActionResult LogIn(string username, string password) 
// name the id's of the form elements as the parameters 
{ 
    if(YouAuthMethodHere(username, password)) 
    { 
     return View("Welcome"); 
    } 
    else 
    { 
     return Redirect(HttpContext.Current.Request.Referer.AbsolutUri); 
    } 
} 

При успешной аутентификации пользователя представление под названием «Welcome.cshtml»/«Welcome.aspx» возвращается в противном случае перенаправлено с того места, где была отправлена ​​форма.

Примечание: референт может быть нулевым (например, если не используется браузер, например, скрипт или скрипт, который выполняет запрос), так что обработка ошибок остается немного.

0

Древний вопрос, но это в основном то же самое, что я делаю прямо сейчас, и мои поиски до сих пор не выявили ответов, соответствующих всем критериям; Я не понимаю, почему так сложно, чтобы процесс входа в систему был полностью инкапсулирован таким образом, но, возможно, я просто пропустил явно написанный пример.

Мое решение, которое работает отлично, просто использовать старый стандарт

System.Web.HttpContext.Current.Response.Redirect(url, true);

... в контроллер для процесса входа в систему.

Отправляя его, поскольку он работает, он поддерживает инкапсуляцию, и он немного менее ужасен, чем решение, которое я видел, с возвратным представлением-содержащим-Javascript-перенаправлением, но мне все же хотелось бы лучше понять как достичь такого рода упаковки в более MVC способом.