我想让我的代码更清晰。我的所有观点都有很多:
@Html.LabelFor(p => p.something)
@Html.EditorFor(p => p.something)
@Html.ValidationMessageFor(p => p.something)
所以我所做的是在每个视图中定义内联布局:
@helper EditorBlock(Expression<Func< MyModel, string>> stringExp=null,
Expression<Func< MyModel, bool>> boolExp=null,
@if (stringExp!= null) {
@Html.LabelFor(stringExp)
@Html.EditorFor(stringExp)
@Html.ValidationMessageFor(stringExp)
}
else if (boolExp!= null) {
@Html.LabelFor(boolExp)
@Html.EditorFor(boolExp)
@Html.ValidationMessageFor(boolExp)
}
请注意,此内联函数与模型有关(请参阅“MyModel”)。另外,我需要为我的模型定义stringExp和boolExp参数(有时甚至是额外的intExp)......
有了这个,我可以留下我的代码:
@EditorBlock(p => p.something)
@EditorBlock(p => p.foo)
@EditorBlock(p => p.bar)...
当我需要将div元素和样式应用于视图时,这会有很大帮助
问题是我需要在每个视图中定义这个内联函数。同样,问题是LabelFor,EditorFor,ValidationMessageFor ...在编译时需要一个lambda表达式......他们不能在变量中使用lambda表达式,也不能以编程方式确定任何内容。
我想要做的是能够将EditorBlock提取到外部文件,这将节省我的“复制和粘贴”,并在每个文件中调整此功能(再次:问题是此功能是模型和参数依赖)...我不知道哪种方法可以帮助我。如果我能够定义宏功能我认为我可以处理它,但我已经看到c#不支持宏函数。有人可以给我一些建议或任何其他方法吗?
提前致谢
答案 0 :(得分:0)
您可以创建扩展方法。类似的东西: (未测试)
public static MvcHtmlString BlockFor<TModel, TValue>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression)
{
var label = html.LabelFor(expression);
var editor = html.EditorFor(expression);
var validator = html.ValidationMessageFor(expression);
return MvcHtmlString.Create("" + label + editor + validator);
}
然后使用:
@Html.BlockFor(model => model.Whatever)