Asp.net mvc RadioButtonOnLambda表达式如何知道名称或值
例如:Html.radiobutton(x=>x.Gender)so 例如,我的模型是PersonAsp.net mvc RadioButtonOnLambda表达式如何知道名称或值,asp.net-mvc,radio-button,Asp.net Mvc,Radio Button,例如:Html.radiobutton(x=>x.Gender)so 例如,我的模型是Person <Expression<Func<Person,bool>> expression=x=>x.Gender x.Gender 但它如何知道将名称和id创建为“性别”? 是否有任何实现从lambda问题中获取属性。。。 因为我基本上看不到任何调用或东西,所以它比较传入的属性,并知道它需要绑定到此属性(因此它使用属性名作为名称和id属性,因此POST会相应地将它
<Expression<Func<Person,bool>> expression=x=>x.Gender
x.Gender
但它如何知道将名称和id创建为“性别”?
是否有任何实现从lambda问题中获取属性。。。
因为我基本上看不到任何调用或东西,所以它比较传入的属性,并知道它需要绑定到此属性(因此它使用属性名作为
名称和id
属性,因此POST
会相应地将它们映射到同一模型)。关于值,它实际上将其与传递到请求中的ViewData
进行比较,找到匹配的值(到属性)并使用这些值
您可以在下面看到如何实现和演示Html.radiobutton()
方法的示例:
public static MvcHtmlString RadioButtonFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object value, IDictionary<string, object> htmlAttributes)
{
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
return RadioButtonHelper(htmlHelper,
metadata,
metadata.Model,
ExpressionHelper.GetExpressionText(expression),
value,
null /* isChecked */,
htmlAttributes);
}
进一步深入到FromModel
调用中,您可以看到它实际上从ViewData中提取了值(或者它继续沿着兔子洞向下,直到找到它):
internal static ModelMetadata FromLambdaExpression<TParameter, TValue>(Expression<Func<TParameter, TValue>> expression,
ViewDataDictionary<TParameter> viewData,
ModelMetadataProvider metadataProvider)
{
/* Omitted for brevity */
case ExpressionType.Parameter:
// Parameter expression means "model => model", so we delegate to FromModel
return FromModel(viewData, metadataProvider);
}
private static ModelMetadata FromModel(ViewDataDictionary viewData, ModelMetadataProvider metadataProvider)
{
return viewData.ModelMetadata ?? GetMetadataFromProvider(null, typeof(string), null, null, metadataProvider);
}