是否可以覆盖ASP.NET MVC的EditorFor
和DisplayFor
。
我想应用一些逻辑来确定是否实际显示内容或只是输出""。
所以我想做这样的事情(伪代码):
public static MyEditorFor(this html)
{
if(ICanRender)
{
call HtmlEditorFor(original);
}
else
{
return EmtpyString;
}
}
这可能吗?
答案 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帮助程序作为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());
}
详细了解TagBuilder
here。
答案 2 :(得分:0)
您可以将custon模型放在“views / shared / EditorTemplates”或“views / shared / DisplayTemplates”下,并将文件放在[Model name] .cshtml中。
Ex:DateTime.cshtml
这样,模型属性中定义的DateTime类型的所有编辑器和显示都将遵循DateTime.cshtml逻辑。
问题是,如果要检索所需的字段,则必须处理ViewData.TemplateInfo中的HTML。