2009-09-27 29 views
22

Tôi hiện đang xây dựng back-end Admin cho một trang web trong ASP.NET MVC.Hiển thị tên trường trong một EditorTemplate (được hiển thị qua EditorFor())

Trong một ứng dụng ASP.NET MVC, tôi đã bắt đầu sử dụng phương pháp helper của EditorFor 'như vậy:

<div id="content-edit" class="data-form"> 
    <p> 
     <%= Html.LabelFor(c => c.Title) %> 
     <%= Html.TextBoxFor(c => c.Title)%> 
    </p> 
    <p> 
     <%= Html.LabelFor(c => c.Biography) %> 
     <%= Html.EditorFor(c => c. Biography)%> 
    </p> 
</div> 

Trong mô hình, trường 'Tiểu sử' đã được trang trí bằng: [UIHelper ("Html")].

Tôi có một cái nhìn cục bộ 'Html' (dưới Views/Shared/EditorTemplates):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %> 

<textarea class="html"> 
    <%= Model.ToString() %> 
</textarea> 

Bây giờ tôi muốn có thuộc tính 'ID' của 'textarea' đặt tên của lĩnh vực này, như thế này:

<textarea id="Biography" class="html"> 
    ... 
</textarea> 

Nhưng tôi không thể thấy cách để làm điều đó với thiết lập hiện tại.

Tất cả những gì tôi có thể nghĩ là tạo một ViewModel 'Html' có chứa thuộc tính 'Giá trị' và thuộc tính 'ControlID'.

Nhưng nếu tôi dựa vào chế độ xem đó, thay vì 'System.XML.Linq.XElement', nó sẽ không còn tương thích với phương pháp trợ giúp 'EditorFor' và tôi phải làm mọi thứ theo cách thủ công.

Có ai có vấn đề tương tự chưa?

+0

Chỉ cần tìm thấy một câu hỏi tương tự được yêu cầu bởi @ nathan-taylor: http: //stackoverflow.com/questions/1329148/asp-net-mvc-solution-layout-suggestions – Jonathan

+1

Câu hỏi đó dường như không liên quan gì đến câu hỏi này. Bạn đã dán liên kết sai? –

Trả lời

36

Bạn sẽ có thể lấy ID mong muốn từ thuộc tính ViewData.TemplateInfo.HtmlFieldPrefix của chế độ xem. Như thế này:

<%@ Control Language="C#" 
     Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %> 
<textarea id="<%= ViewData.TemplateInfo.HtmlFieldPrefix %>" class="html"> 
    <%= Model.ToString() %> 
</textarea> 

Để hiển thị tại sao làm việc này, đây là nơi ở TemplateHelpers.cs (của MVC2 Preview 1 nguồn), nơi ViewData được khởi tạo cho mẫu biên tập kiểm soát:

ViewDataDictionary viewData = new ViewDataDictionary(html.ViewDataContainer.ViewData) { 
    Model = modelValue, 
    TemplateInfo = new TemplateInfo { 
     FormattedModelValue = formattedModelValue, 
     ModelType = modelType, 
     HtmlFieldPrefix = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(expression), 
     IsNullableValueType = (underlyingNullableType != null), 
    } 
}; 

Trong cuộc gọi ở trên, "biểu thức" được khởi tạo (tiếp tục lên ngăn xếp cuộc gọi) với tên của thuộc tính đang được chỉnh sửa.

BTW, @Sperling dưới đây bắt một chi tiết ban đầu tôi bỏ lỡ: nếu bạn đang sử dụng (hoặc có thể sử dụng) một tổ chức phi mặc định HtmlHelper.IdAttributeDotReplacement, sau đó bạn sẽ muốn thay thế các dấu chấm trong HtmlPrefix tài sản với HtmlHelper.IdAttributeDotReplacement.

+3

Đây không phải là giải pháp hợp lệ trong trường hợp mô hình thu thập lồng nhau. Trong trường hợp đó '' 'HtmlFieldPrefix''' trả về' '' collectionModel [index]. {PropertyName} '' 'nhưng theo mặc định MVC tạo id trong một định dạng' '' collectionModel_ {index} __ {PropertyName} '' '.Vì vậy, nó là an toàn để sử dụng '' 'ViewData.TemplateInfo.GetFullHtmlFieldId (string.Empty)' '' thay vì '' 'HtmlFieldPrefix''' – Rajeesh

4

Đã sử dụng tính năng này để tạo id (có tiền tố mô hình). Bỏ qua phần .Replace() nếu bạn muốn thuộc tính name.

<%=Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(String.Empty).Replace(".", HtmlHelper.IdAttributeDotReplacement) %> 
+0

này hoạt động quá, nhưng bạn không thực sự cần GetFullHtmlFieldId-- nếu bạn nhìn vào thực hiện phương thức đó, nếu đối số của nó là String.Empty, nó chỉ trả về giá trị của thuộc tính HtmlFieldPrefix. –

0

Trong trường hợp của chúng tôi, chúng tôi đã phải sử dụng Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName với ExpressionHelper.GetExpressionText

mà dao cạo đã được sử dụng như thế này:

  // hiddenFor was caching the value of this html input, and the value alone, nothing else on the page! 
      Expression<Func<Web.ViewModels.ApiSettingsViewModel, int>> expression = (m => m.OrgApiLoginCredentials[i].OrgApiLoginId); 
     } 
     <input type="hidden" value="@Model.OrgApiLoginCredentials[i].OrgApiLoginId" name="@Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression))" class="data-org-api-login-id"/> 
Các vấn đề liên quan