ASP.Net MVC:PartialView的问题

时间:2009-12-17 10:43:35

标签: asp.net-mvc asp.net-mvc-partialview

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

我对此代码有两个问题:

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

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

  3. 有没有人知道为什么用户没有被传递到LogOn.ascx? 感谢

1 个答案:

答案 0 :(得分:0)

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

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

由于您已经为此添加了默认路由,因此当您从页面调用它时,实际上并未将User对象传递给partial:

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

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

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