复杂的剃须刀功能或助手
complex razor function or helper
我有一个包含十几个属性的数据模型,比如 value1、value2、value3(实际上它们有有意义的名称,但在这里并不重要)。
在我的显示中,我需要为每个值执行以下操作:
@if (Model.Value1 >= 2)
{
<div class="col-sm-6 test-box-item">
<h5>@Html.DisplayNameFor(_ => Model.Value1)</h5>
<div>@Model.Value1</div>
</div>
}
这是一打。
我想创建一个@function 或@helper 并将代码简化为:
DisplayValue(_ => Model.Value1)
DisplayValue(_ => Model.Value2)
...
但不知道该怎么做。
有什么想法吗?我想我需要一个接受表达式的函数,但我真的不知道如何编写它。
检查这个助手
public static class HmtlExtensions
{
public static HtmlString DisplayValue<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
{
if (expression == null)
throw (new ArgumentNullException("expression"));
var result = new StringBuilder();
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
// get value
var _value = metadata.Model.ToString();
int value = 0;
if (int.TryParse(_value, out value) && value >= 2)
{
result.Append("<div class=\"col-sm-6 test-box-item\"><h5>");
result.Append(helper.DisplayNameFor(expression));
result.Append("</h5><div>");
result.Append(_value);
result.Append("</div></div>");
}
return MvcHtmlString.Create(result.ToString());
}
}
并且在您看来像
一样使用它
@Html.DisplayValue(x => x.Value1)
@Html.DisplayValue(x => x.Value2)
@Html.DisplayValue(x => x.Value3)
我有一个包含十几个属性的数据模型,比如 value1、value2、value3(实际上它们有有意义的名称,但在这里并不重要)。
在我的显示中,我需要为每个值执行以下操作:
@if (Model.Value1 >= 2)
{
<div class="col-sm-6 test-box-item">
<h5>@Html.DisplayNameFor(_ => Model.Value1)</h5>
<div>@Model.Value1</div>
</div>
}
这是一打。
我想创建一个@function 或@helper 并将代码简化为:
DisplayValue(_ => Model.Value1)
DisplayValue(_ => Model.Value2)
...
但不知道该怎么做。
有什么想法吗?我想我需要一个接受表达式的函数,但我真的不知道如何编写它。
检查这个助手
public static class HmtlExtensions
{
public static HtmlString DisplayValue<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
{
if (expression == null)
throw (new ArgumentNullException("expression"));
var result = new StringBuilder();
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
// get value
var _value = metadata.Model.ToString();
int value = 0;
if (int.TryParse(_value, out value) && value >= 2)
{
result.Append("<div class=\"col-sm-6 test-box-item\"><h5>");
result.Append(helper.DisplayNameFor(expression));
result.Append("</h5><div>");
result.Append(_value);
result.Append("</div></div>");
}
return MvcHtmlString.Create(result.ToString());
}
}
并且在您看来像
一样使用它@Html.DisplayValue(x => x.Value1)
@Html.DisplayValue(x => x.Value2)
@Html.DisplayValue(x => x.Value3)