Asp.net

ASP.NET MVC 2 - ViewModel 前綴

  • February 25, 2013

我想在我的視圖中使用 RenderPartial 兩次,並關聯不同的模型。問題是兩個模型中都存在一些屬性(暱稱、密碼)。它們沒有前綴,因此即使是 id 或名稱在輸出中也是相等的。現在,如果我有暱稱或密碼的模型錯誤,這兩個欄位都會突出顯示。

主視圖:

<div>
   <% Html.RenderPartial("Register", Model.RegisterModel); %>
</div>
<div>
   <% Html.RenderPartial("Login", Model.LoginModel); %>
</div>

登錄部分視圖:

<% using (Html.BeginForm("Login", "Member")) { %>
<fieldset>
   <legend>Login</legend>
   <p>
       <%= Html.LabelFor(x => x.Nickname) %>
       <%= Html.TextBoxFor(x => x.Nickname) %>
   </p>
   <p>
       <%= Html.LabelFor(x => x.Password) %>
       <%= Html.PasswordFor(x => x.Password) %>
   </p>    
   <input type="submit" value="Login" />
</fieldset>
<% } %>

註冊部分視圖:

<% using (Html.BeginForm("Register", "Member")) { %>
<fieldset>
   <legend>Register</legend>
   <p>
       <%= Html.LabelFor(x => x.Nickname) %>
       <%= Html.TextBoxFor(x => x.Nickname) %>
   </p>
   <p>
       <%= Html.LabelFor(x => x.Email) %>
       <%= Html.TextBoxFor(x => x.Email) %>
   </p>
   <p>
       <%= Html.LabelFor(x => x.Password) %>
       <%= Html.PasswordFor(x => x.Password) %>
   </p>
   <p>
       <%= Html.LabelFor(x => x.PasswordRepeat) %>
       <%= Html.PasswordFor(x => x.PasswordRepeat) %>
   </p>
   <input type="submit" value="Register" />
</fieldset>
<% } %>

我怎樣才能改變這個?

Html.RenderPartial您可以使用將處理前綴的編輯器模板代替使用。

所以在你的主要觀點中:

<div>
   <%-- See below what does the second argument mean --%>
   <%= Html.EditorFor(x => x.RegisterModel, "RegisterModel") %>
</div>
<div>
   <%= Html.EditorFor(x => x.LoginModel, "LoginModel") %>
</div>

然後創建一個文件夾Views/Shared/EditorTemplates/RegisterModel.ascx(這個文件的名字用在EditorFor輔助方法中)。還要注意,這個部分應該強類型為RegisterModel屬性的類型:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Ns.Models.RegisterModel>" %>

<% using (Html.BeginForm("Register", "Member")) { %>
<fieldset>
   <legend>Register</legend>
   <p>
       <%= Html.LabelFor(x => x.Nickname) %>
       <%= Html.TextBoxFor(x => x.Nickname) %>
   </p>
   <p>
       <%= Html.LabelFor(x => x.Email) %>
       <%= Html.TextBoxFor(x => x.Email) %>
   </p>
   <p>
       <%= Html.LabelFor(x => x.Password) %>
       <%= Html.PasswordFor(x => x.Password) %>
   </p>
   <p>
       <%= Html.LabelFor(x => x.PasswordRepeat) %>
       <%= Html.PasswordFor(x => x.PasswordRepeat) %>
   </p>
   <input type="submit" value="Register" />
</fieldset>
<% } %>

您可以為登錄模型定義不同的部分Views/Shared/EditorTemplates/LoginModel.ascx

如果由於某種原因您不能執行 EditorTemplate,您可以在您的視圖中執行此操作:

var dataDict = new ViewDataDictionary();
dataDict.TemplateInfo.HtmlFieldPrefix = "myPrefixHere";
Html.RenderPartial("myPartialViewName", myPartialViewModel, dataDict);

瞧,您的 PartialView 中的所有輸入都將帶有前綴。

感謝 R0MANARMY 指出這一點。

引用自:https://stackoverflow.com/questions/2473399