Шаблоны MVC 2 - возможно ли перенаправить текущий шаблон редактора в шаблон отображения на основе метаданных? - PullRequest
1 голос
/ 24 июля 2010

Для проекта, с которым я работаю, меня попросили перенаправить шаблон редактора в его шаблон отображения на основе метаданных, которые предоставляются вместе с моделью.

Теперь я искал способ сделать этодо того, как он попадет в шаблон редактора, но это, кажется, вызывает больше проблем, чем стоит, по крайней мере с тем, как система была спроектирована.

Самый простой пример - редактор строк, это простое текстовое поле, но если IsReadOnlyМы хотим, чтобы он отображался только как текст, а не как отключенное текстовое поле.

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<%
    if (this.ViewData.ModelMetadata.IsReadOnly)
    {
        Response.Write(Html.DisplayForModel());
    }
    else if (this.ViewData.ModelMetadata.ShowForEdit)
    {
<%= Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @class = "text-box single-line" }) %>
<% } %>

Пока единственное реальное решение, которое я могу найти, - это скопировать шаблон отображения в шаблон редактора.У кого-нибудь есть идеи, как я могу сделать что-то, что будет работать без репликации большего количества кода?

1 Ответ

1 голос
/ 24 июля 2010

Почему бы не сделать это вне самого шаблона редактора?Определите метод расширения, который проверяет, является ли свойство доступным только для чтения, затем отображает шаблон редактирования или отображения.Вам нужно будет скопировать PropertyHelper класс из этого ответа .

public MvcHtmlString DisplayOrEditFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> selector)
{
    var property = PropertyHelper<TModel>.GetProperty(selector);
    if(property.CanWrite)
    {
        return helper.EditorFor(selector);
    }
    return helper.DisplayFor(selector);
}

Тогда, по вашему мнению, просто наберите

<%: Html.DisplayOrEditFor(x => x.Name) %>

Единственный недостаток - это выигрышне работает с Html.EditorForModel().

...