2010-03-18 39 views
12

Tôi muốn sử dụng RenderPartial hai lần trong chế độ xem của mình với các mô hình khác nhau được liên kết. Vấn đề là một số thuộc tính có mặt trong cả hai mô hình (biệt danh, mật khẩu). Họ không có tiền tố, vì vậy ngay cả các id hoặc tên đều bình đẳng trong đầu ra. Bây giờ, nếu tôi có lỗi mô hình cho biệt hiệu hoặc mật khẩu, cả hai trường sẽ được tô sáng.ASP.NET MVC 2 - ViewModel Tiền tố

Main Xem:

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

Đăng nhập PartialView:

<% 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> 
<% } %> 

Đăng ký PartialView:

<% 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> 
<% } %> 

Làm thế nào tôi có thể thay đổi điều này?

Trả lời

8

Thay vì sử dụng Html.RenderPartial bạn có thể sử dụng editor templates để xử lý tiền tố.

Vì vậy, trong giao diện chính của bạn:

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

Và sau đó tạo ra một thư mục Views/Shared/EditorTemplates/RegisterModel.ascx (Tên của tập tin này được sử dụng trong phương pháp EditorFor helper). Cũng cần chú ý rằng phần này nên được gõ mạnh vào loại tài sản 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> 
<% } %> 

Bạn có thể xác định một phần khác nhau cho các mô hình đăng nhập trong Views/Shared/EditorTemplates/LoginModel.ascx

0

Có vẻ như có quá tải cho TextBoxFor cho phép bạn chỉ định các thuộc tính HTML phụ. Nó không phải là một giải pháp lý tưởng, nhưng nó sẽ cho phép bạn thay đổi id (và có thể tên?) Của các hộp văn bản được trả lại. Tất nhiên thay đổi tên có lẽ sẽ vít mọi thứ lên khi bạn cố gắng để gửi biểu mẫu.

0

Trước hết, bạn có thể sử dụng Html.TextBox("input form name", ...) và đặt tên thành bất kỳ điều gì bạn muốn. Có vấn đề lớn hơn bạn sẽ cung cấp tiền tố ở mức Html.RenderPartial() như thế nào? Bạn đã cung cấp một phiên bản mẫu. Vì vậy, mà không thay đổi mô hình xem của họ, chỉ có một khả năng nữa: để viết quá tải của riêng bạn cho RenderPartial() sẽ lấy tiền tố và chuyển nó cho người khác.

Kiểm tra điều này. Một người nào đó đã viết một loạt các tình trạng quá tải hỗ trợ thiết lập các tiền tố. TextBoxFor rendering to HTML with prefix on the ID attribute

Nếu thiếu bất kỳ trường hợp nào, bạn có thể xem mẫu làm cách nào để mở rộng những thứ này với các mẫu bổ sung mà bạn có thể cần.

+1

Bạn không cần phải viết quá tải của riêng mình cho RenderPartial, đã có quá tải khiến bạn xác định lại bộ sưu tập ViewData là gì. Bạn chỉ có thể thêm tiền tố của mình vào đó và yêu cầu mô hình của bạn tìm kiếm nó. Xem: http://msdn.microsoft.com/en-us/library/dd470827.aspx – R0MANARMY

12

Nếu bạn không thể làm một EditorTemplate đối với một số lý do, bạn có thể thực hiện việc này trong Chế độ xem của mình:

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

Xin xem, tất cả các yếu tố đầu vào trong một phần của bạn sẽ được thêm tiền tố.

Kêu gọi R0MANARMY để chỉ ra điều này.

+2

và dưới dạng một lớp lót: Html.RenderPartial ("myPartialViewName", myPartialViewModel, mới ViewDataDictionary() {TemplateInfo = new TemplateInfo() {HtmlFieldPrefix = "myPrefixHere"}}) –

+0

Tuyệt vời, cảm ơn – karaxuna

+0

Nếu tôi đang sử dụng RenderAction và hành động đó lần lượt trả về PartialView, không phải PartialView cũng như RenderAction có quá tải ViewDataDictionary mà tôi có thể thấy. Tôi đã hy vọng nó sẽ là một quá tải về 'return PartialView ('. Bất kỳ gợi ý? – AaronLS