在编译时插入代码或任何替代解决方案
本文关键字:任何替 解决方案 代码 编译 插入 | 更新日期: 2023-09-27 18:33:27
我想让我的代码更干净。我所有的观点都有很多:
@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# 不支持宏函数。有人可以给我一些建议或任何其他方法吗?
提前致谢
您可以创建一个扩展方法。类似这样的东西:(未测试(
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)