2016-09-21 3 views
0

Возможно ли переопределить ASP.NET MVC EditorFor и DisplayFor.Переопределить ASP.NET MVC EditorFor

Я хочу применить некоторую логику относительно того, действительно ли показывать содержимое или просто выводить «».

Так что я хочу сделать что-то вроде этого (псевдокод):

public static MyEditorFor(this html) 
{ 
    if(ICanRender) 
    { 
    call HtmlEditorFor(original); 
    } 
    else 
    { 
    return EmtpyString; 
    } 
} 

Возможно ли это?

+1

Возможный дубликат [В MVC можно переопределить шаблон редактора] (http://stackoverflow.com/questions/11599204/in-mvc-is-it-possible-to-override-an-editor-template) –

+0

Не уверен, что вы подразумеваете под _override_, но вы можете создать свои собственные шаблоны дисплея и редактора, которые будут использоваться этими методами для рендеринга, что бы вы хотели. –

+0

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

ответ

2

Это звучит, как вы хотите расширение:

public static MvcHtmlString MyEditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) { 
    if(ICanRender) 
    { 
     return System.Web.Mvc.Html.EditorExtensions.EditorFor(html, expression); 
    } 
    else 
    { 
     return MvcHtmlString.Create(string.Empty); 
    } 
} 

Это codesnipped не тестировался, но он должен работать.

1

Вы можете создать свои собственные html-помощники в качестве методов расширения для HtmlHelper или HtmlHelper<TModel>. Просто добавьте метод расширения, как показано ниже:

public static MvcHtmlString MyEditorFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TProperty>> expression) 
{ 

} 

Конечно, вы можете добавить дополнительные параметры по мере необходимости. Внутри этого метода доступ ко всем методам htmlHelper. Возврат обычный EditorFor, например:

public static MvcHtmlString MyEditorFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TProperty>> expression) 
{ 
    return htmlHelper.EditorFor(expression); 
} 

Или вы можете создать свой собственный элемент (или их сочетание), как вам нужно:

public static MvcHtmlString MyEditorFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TProperty>> expression) 
{ 
    TagBuilder div = new TagBuilder("div"); 
    div.AddCssClass("some-css"); 

    MvcHtmlString editor = htmlHelper.TextBoxFor(expression); 
    div.InnerHtml = editor.ToHtmlString(); 

    return new MvcHtmlString(div.ToString()); 
} 

Подробнее о TagBuilderhere.

0

Вы можете поместить модели custon под «views/shared/EditorTemplates» или «views/shared/DisplayTemplates» и поместить файлы с именем [Model name] .cshtml.

Ex: DateTime.cshtml

Таким образом, все редакторы и дисплеи с типом DateTime, определенному в модели свойств будут следовать логике DateTime.cshtml.

Проблема заключается в том, что вам придется иметь дело с HTML в ViewData.TemplateInfo, если вы хотите получить нужные поля.

Смежные вопросы