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

时间:2014-12-08 12:08:44

标签: c# visual-studio-2012 razor asp.net-mvc-5

我想让我的代码更清晰。我的所有观点都有很多:

@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#不支持宏函数。有人可以给我一些建议或任何其他方法吗?

提前致谢

1 个答案:

答案 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)