1

我有位于母版页 site.master 上的 LogOn.ascx 控件:

<% 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 %>

这段代码有两个问题:

  1. 调用后return PartialView("LogOn")我得到异常“IControllerFactory 'UI.Services.ControllerFactory'没有返回名称为'default.aspx'的控制器”这个问题通过为“default.aspx”添加路由来解决。但是为什么我打电话时请求会转到“default.aspx” return PartialView(..)?(我正在使用 VS 网络服务器)

  2. 我在 LogOn.ascx 中得到空引用异常,即使用户已成功通过身份验证并且非空值在以下行被传递到 PartialView:

有谁知道为什么没有将用户传递到 LogOn.ascx 中?谢谢

4

1 回答 1

0

我假设您的登录表单正在向服务器执行标准提交(即发送整个页面)而不是 AJAX 帖子?

如果是这种情况,那么来自 Login 操作的操作结果应该是一个整体视图,而不是部分视图 - 没有页面可以托管部分视图。

从这里开始,您现在已经为 Default 添加了一条路由,您实际上并没有将 User 对象传递给您从页面调用它的部分:

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

您需要与用户一起调用它,这意味着如果您不使用成员资格提供程序,您需要将用户添加到 ViewData 或您要传回的模型中。

我假设您正在 LogOn 部分中进行一些检查以检查请求是否经过身份验证,而不是检查 User 对象是否已被传入 - 因为您对此部分的大多数调用将来自没有的母版页t 传入 User 对象,这些大多会失败。

于 2009-12-17T11:49:16.560 回答