如何在Razor Pages的asp-for标签助手中正确传递ModelExpression?
解决方案
你的问题出在直接将ModelExpression实例传递给asp-for标签助手——标签助手会把这个实例当成当前模型的一个属性(即Model.modelExpression),而非利用实例本身携带的表达式信息,所以才会生成错误的id、name和显示文本。
要让当前写法生效,只需移除手动创建ModelExpression的步骤,直接把表达式树传递给asp-for即可,标签助手会自动处理表达式并生成正确的ModelExpression:
@model IndexModel @{ async Task Render<TValue>(Expression<Func<IndexModel, TValue>> expression) { <label asp-for="@expression"></label> <input asp-for="@expression" /> } } @{await Render(x => x.Foo);} @{await Render(x => x.Bar);} @{await Render(x => x.Baz);}
原理说明
asp-for标签助手的底层实现会接收表达式树,自动调用ModelExpressionProvider创建对应的ModelExpression,并基于表达式解析出正确的字段名称、显示文本和绑定值。手动传递ModelExpression实例会打破这个逻辑,导致标签助手错误地将变量名当作属性名解析。
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

