在编译时插入代码或任何替代解决方案

本文关键字:任何替 解决方案 代码 编译 插入 | 更新日期: 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)
相关文章: