覆盖ASP.NET MVC EditorFor

时间:2016-09-21 11:00:35

标签: asp.net-mvc

是否可以覆盖ASP.NET MVC的EditorForDisplayFor

我想应用一些逻辑来确定是否实际显示内容或只是输出""。

所以我想做这样的事情(伪代码):

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

这可能吗?

3 个答案:

答案 0 :(得分: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);
    }
}

代码被检测未经测试但它应该有效。

答案 1 :(得分:1)

您可以创建自己的Html帮助程序作为HtmlHelperHtmlHelper<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());
}

详细了解TagBuilder here

答案 2 :(得分:0)

您可以将custon模型放在“views / shared / EditorTemplates”或“views / shared / DisplayTemplates”下,并将文件放在[Model name] .cshtml中。

Ex:DateTime.cshtml

这样,模型属性中定义的DateTime类型的所有编辑器和显示都将遵循DateTime.cshtml逻辑。

问题是,如果要检索所需的字段,则必须处理ViewData.TemplateInfo中的HTML。