2009-12-17 98 views
1

我有位于母版页的Site.Master LogOn.ascx控制:ASP.Net MVC:问题PartialView

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

此控件包含形式的电子邮件和密码textboxed其提交的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”的路由来解决。但是,当我打电话给return PartialView(..)时,为什么请求会转到“default.aspx”? (我使用VS web服务器)

  2. 我得到空引用异常里面LogOn.ascx即使用户已成功通过身份验证和非空值传递到PartialView以下行:

有没有人有一个想法,为什么用户不会被传入LogOn.ascx? 谢谢

回答

0

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

如果是这样的话,那么从登录操作你的行动的结果应该是一个整体视图,而不是一个局部 - 没有页面主办的部分在

根据这一点,你已经添加了一个对于默认路由现在,您实际上并不传递用户对象的部分,你从页面调用它:

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

你需要与用户调用这个,这将意味着你需要要将用户添加到ViewData或要传回的模型(如果您未使用成员资格提供程序)。

我假设你正在LogOn部分中进行一些检查,以检查请求是否通过验证,而不是检查User对象是否已被传入 - 因为大部分对此部分的调用都将来自主页面没有通过用户对象,这些将大多失败。

+0

本,谢谢你的回复。你是对的 - 这是非ajax调用,并且在LogOn.ascx中有一个检查来确定当前的请求是否已通过身份验证(例如,我将其剥离)。 我从MVC开始,所以我可能会误解一些概念。所以我在'返回视图(“LogOn”,用户)上更改'返回PartialView(“LogOn”,用户)“' - 结果相同。 我没有明确表达您的观点:“您需要与用户调用<%Html.RenderPartial(”LogOn“);%>”。我认为视图共享其ViewData和模型与嵌套局部视图(如果局部视图没有自己的显式传递的视图数据)。或者我错了? – alex 2009-12-17 13:22:39