0

我正在使用模態來登錄和註冊用戶。每種模式都是強類型的,以便使用ASP.NET內置帳戶類(RegisterModelLoginModel)。但是,由於調用這些模式的兩個按鈕位於導航欄上,並且導航欄放置在每個頁面上,所以我收到錯誤,因爲大多數視圖都是強類型的,因此無法處理局部視圖(模式)使用不同的強類型模型。如何在不同類型的強類型視圖中處理強類型模態

強類型模式在強類型環境中如何處理?

_layout:

<body> 
<div class="navbar"> 
    @Html.Partial("_LoginPartial") // contains buttons to call login/register modals 
</div> 

<div> 
    @Html.Partial("_LoginModal") 
    @Html.Partial("_RegisterModal") 
</div> 

<div class="container"> 
    @Html.RenderBody() 
</div> 
</body> 

/新聞/索引:

@model List<NewsBulletinViewModel> 

LoginModal:

@model NoName.Models.LoginModel 

相關提示: 因爲我有我的情態中的形式,如何能當驗證錯誤發生時,我會回顧這些模態?理想情況下,模態應該再次彈出(或從未關閉)顯示的驗證錯誤。

+0

當你調用'通過_LoginModal'或''_RegisterModal' @ Html.Partial'爲什麼你需要傳遞一個「模型」呢?它包含什麼? – haim770

+0

@ haim770:看到我對Simon的回答的評論。 –

回答

1

@Html.Partial中有一個過載需要一個對象,用於部分頁面的Model。如果在佈局中包含「部分」,則在每個頁面中,都需要邏輯來保存該數據。例如,如果你把LoginModelRegisterModel,你可以這樣做:

@Html.Partial("_LoginPartial", ViewBag.LoginModel ?? new LoginModel()) 
@Html.Partial("_RegisterPartial", ViewBag.RegisterModel ?? new RegisterModel()) 

而且留給執行控制器把一個LoginModel(或RegisterModel)的作用。如果ViewBag中沒有任何內容,它將回退到創建一個空的。

編輯:基礎上的附加信息,我會爲LoginPartial做到這一點(RegisterPartial將是相同的邏輯):

public class AccountController : Controller 
{ 
    public ActionResult LoginPartial() 
    { 
     return PartialView("_LoginPartial", (Session["Login"] as LoginModel) ?? new LoginModel()); 
    } 

    [HttpPost] 
    public HttpStatusCodeResult SaveLoginModel(LoginModel model) 
    { 
     Session["Login"] = model; 
     return new HttpStatusCodeResult(200); 
    } 
} 

,然後在_LoginPartial,做你想,但添加一個javascript代碼來發送一個ajax post請求到你的控制器的SaveLoginModel動作當值改變時保持你的模型同步(有大量的信息圍繞如何做到這一點)。

現在,而不是做:

@Html.Partial("_LoginPartial", ViewBag.LoginModel ?? new LoginModel()) 
@Html.Partial("_RegisterPartial", ViewBag.RegisterModel ?? new RegisterModel()) 

你會做:

@Html.Action("LoginPartial", "AccountController"); 
@Html.Action("RegisterPartial", "AccountController"); 
+0

我使用各自模式的模型來創建輸入字段並對其執行驗證,同時允許將輸入值輕鬆傳輸到'AccountController'。就我而言,當你瀏覽網站時,這些模型的模型可能是空的,但當它們必須被實際使用時,它們非常方便。你會建議做不同的事情嗎? –

+0

如果我理解正確,那麼即使他移動頁面,也要跟蹤用戶輸入的內容。你可以做到這一點,但不要忘記http是無狀態的,如果你想跟蹤它,你需要定期ping你的服務器來保存這些數據(大概在會話字典中)。我會編輯我的答案,建議你可以做什麼,但我建議你反對。 –

+0

沒有必要,你給我的答案已經完全修復了,據我所知!我只需要找到一種方法將空模型發送給部分視圖,這樣編譯器就不會再生氣了,它的模型與主視圖不同。我不得不稍微改變一下這個語法,但是你提供的解決方案似乎有訣竅。 –