ASP.Net MVC: проблемы с PartialView - PullRequest
       12

ASP.Net MVC: проблемы с PartialView

1 голос
/ 17 декабря 2009

У меня есть элемент управления LogOn.ascx, который находится на главной странице site.master:

<% Html.RenderPartial("LogOn"); %>

Этот элемент управления содержит форму с текстовым адресом электронной почты и паролем, которая отправляется в LoginController:

public class LoginController : Controller
{
     ...
    [HttpPost]
    public ActionResult Login(string email, string password)
    {
        if (this.userRepository.ExistByEmail(email) &&
            this.authenticationService.IsPasswordMatches(email, password))
        {
            var user = this.userRepository.GetByEmail(email);
            this.userSession.LogIn(user);
            return PartialView("LogOn", user);
        }
        return PartialView("LogOn");
    }
}

Поэтому, если пользователь успешно прошел аутентификацию, я передаю его в модель частичного представления LogOn (упрощенно):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Core.Model.User>" %>
<%= this.Model.FirstName %>

У меня 2 проблемы с этим кодом:

  1. После вызова return PartialView("LogOn") я получаю исключение "IControllerFactory 'UI.Services.ControllerFactory' не вернул контроллер для имени 'default.aspx'" Эта проблема решена путем добавления маршрутизации для «default.aspx». Но почему запрос переходит в default.aspx, когда я звоню return PartialView(..)? (Я использую веб-сервер VS)

  2. Я получаю исключение нулевой ссылки внутри LogOn.ascx, даже если пользователь был успешно аутентифицирован, и ненулевое значение было передано в PartialView в следующей строке:

У кого-нибудь есть идея, почему пользователь не переходит в LogOn.ascx? Спасибо

1 Ответ

0 голосов
/ 17 декабря 2009

Я предполагаю, что ваша форма входа в систему выполняет стандартную отправку обратно на сервер (то есть отправку всей страницы), а не AJAX-постом?

Если это так, то результатом вашего действия от действия «Вход в систему» ​​должен быть весь вид, а не частичный - нет страницы для размещения частичного элемента.

Исходя из этого, поскольку вы добавили маршрут для Default сейчас, вы фактически не передаете объект User в партиал, как вы вызываете его со страницы:

<% Html.RenderPartial("LogOn"); %>

Вам нужно будет позвонить этому пользователю, а это значит, что вам нужно добавить пользователя либо в ViewData, либо в модели, которые вы возвращаете, если вы не используете поставщиков членства.

Я предполагаю, что вы выполняете некоторые проверки в частичном входе в систему LogOn, чтобы проверить, аутентифицирован ли запрос, кроме проверки на предмет того, был ли передан объект User - потому что большинство ваших вызовов в эту частичную часть будут поступать с главной страницы. который не передается в объекте User, в большинстве случаев он потерпит неудачу.

...