2016-11-01 80 views
0

小时后。稍后再关闭。稍后拉动头发。c#mvc助手扩展Html.DisplayFor

Prs_Role_ID_Deleted是一个int。

在我的Details.cshtml中,如果model.Prs_Role_ID_Deleted的值为0(zeri),我试图让它输出一个“”(空字符串)。

问题是我无法得到model => model.Prs_Role_ID_Deleted的值。 我可以得到属性名称。 我可以得到model.Prs_Role_ID_Deleted。

我无法得到model.Prs_Role_ID_Deleted的22

@Html.ZZZ(model => model.Prs_Role_ID_Deleted) 


public static MvcHtmlString ZZZ<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression) 
{ 
    var id = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(ExpressionHelper.GetExpressionText(expression)); 
    return "whatever"; 
} 

我开始认为这是不可能的确定值应等于价值。


谢谢SLaks。这是解决方案。

为其他开发者发布解决方案。

AFTER SLaks建议 @ Html.DisplayForWithID_ZeroIsBlank(型号=> model.Prs_Role_ID_Deleted, “跨度”)

公共静态MvcHtmlString DisplayForWithID_ZeroIsBlank(此的HtmlHelper帮手,表达式>表达,串wrapperTag = “跨度” ) { var id = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(ExpressionHelper.GetExpressionText(expression)); TModel model =(TModel)helper.ViewContext.ViewData.ModelMetadata.Model; var ctlValue = expression.Compile()(helper.ViewData.Model); string OutputValue =“愚蠢的开发人员,这只适用于int。”; 类型type = ctlValue.GetType();如果(type.Equals(typeof(int))) {s = ctlValue.ToString()。Trim(); if(ctlValue == null || ctlValue.ToString()。Trim()==“0”) { OutputValue =“”; } else { OutputValue = ctlValue.ToString(); } } return MvcHtmlString.Create(string.Format(“< {0} id = \”{1} \“> {2}”,wrapperTag,id,OutputValue,helper.DisplayFor(expression))); }

+0

为什么不创建一个视图模型,做所有的转换呢? – Fran

+0

弗兰,我认为MVC的工作方式是“模型”只包含纯数据的模型。输出的格式是在cshtml,JS或助手扩展中。对我而言,组合输出格式就好像把汉堡包放在与冰淇淋相同的盘子上。是的,它可以做到,但它会变得真正sl。。 – JenniferWalters

+0

视图模型与格式化输出无关,视图模型包含页面的数据项。纯数据究竟是什么? – Fran

回答

3

您需要编译的表达式的委托,然后调用它的模型:

expression.Compile()(helper.ViewData.Model);