2009-12-17 125 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