PlT*_*lor 6 lambda asp.net-mvc-3
我已经实现了一个MVC扩展来格式化我的应用程序中的数字.它基于此处的代码.如下
public static MvcHtmlString DecimalBoxFor<TModel>(this HtmlHelper<TModel> html, Expression<Func<TModel, double?>> expression, string format, object htmlAttributes = null)
{
var name = ExpressionHelper.GetExpressionText(expression);
double? dec = expression.Compile().Invoke(html.ViewData.Model);
var value = dec.HasValue ? (!string.IsNullOrEmpty(format) ? dec.Value.ToString(format) : dec.Value.ToString()): "";
return html.TextBox(name, value, htmlAttributes);
}
Run Code Online (Sandbox Code Playgroud)
当我使用以下Razor语法行调用它时
@Html.DecimalBoxFor(model => Model.PointAttributes[i].Data.Y,"0.000", new { @class = "span1 number" })
Run Code Online (Sandbox Code Playgroud)
我得到一个例外,因为我的扩展名中的变量'name'是一个空字符串.我已经尝试将var name行更改为this但它只给了我'Y'的属性名称,而不是我需要将模型绑定回MVC的完整'Model.PointAttributes [i] .Data.Y'.
var name = ((expression.Body is MemberExpression ?((MemberExpression)expression.Body).Member : ((MemberExpression)((UnaryExpression)expression.Body).Operand).Member)).Name;
Run Code Online (Sandbox Code Playgroud)
Nad*_*av 8
尝试使用此功能:
static public string GetExpressionText(LambdaExpression p)
{
if (p.Body.NodeType == ExpressionType.Convert || p.Body.NodeType == ExpressionType.ConvertChecked)
{
p = Expression.Lambda(((UnaryExpression)p.Body).Operand,
p.Parameters);
}
return ExpressionHelper.GetExpressionText(p);
}
Run Code Online (Sandbox Code Playgroud)
这是一种已知的行为.我已经想出了编写我自己的ExpressionHelper那个句柄的特定情况.现在你有两个选择:
使用NuGet包:
Install-Package Mariuzzo.Web.Mvc.Extras
Run Code Online (Sandbox Code Playgroud)或者只需获取前面提到的ExpressionHelper的源代码并将其粘贴到您的项目中.
| 归档时间: |
|
| 查看次数: |
3222 次 |
| 最近记录: |