Asp.net mvc RadioButtonOnLambda表达式如何知道名称或值

Asp.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会相应地将它

例如:Html.radiobutton(x=>x.Gender)so 例如,我的模型是Person

<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);
}