[英]Difference between
我正在通过电子邮件和密码创建一个简单的登录页面。 我有一个类LoginViewModel,它将一个User类作为其中的成员变量。 该类包含emailAddress。 密码位于主LoginViewModel中。 我的User类引用如下:
public User User { get; set; }
当用户填写电子邮件地址和密码并点击提交时,LoginViewModel会正确地将字段绑定到视图中User类内的电子邮件地址:
@Html.TextBoxFor(m => m.User.Email) // m is the LoginViewModel model
我想知道为什么它不起作用如果我上面的代码看起来像这样:
public User User = new User();
它将User实例中的电子邮件显示为空值。 我知道构造函数的使用可能比两者都好,但这两者之间有什么区别。
编辑#1:在“登录”操作方法上发布时,会找到我为模型中的电子邮件字段输入的值:
public User User { get; set; }
这个不是:
public User User = new User(); // --> because of this email field value shows up null
这是DefaultModelBinder
一个功能,它只会绑定属性与公共getter / setter。 如果您浏览源代码,该过程包括初始化模型的新实例,然后尝试设置其属性的值。 这里的关键部分是
protected virtual void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
{
...
if (!propertyDescriptor.IsReadOnly && !isNullValueOnNonNullableType)
{
...
propertyDescriptor.SetValue(bindingContext.Model, value) // this is where the value is set
...
}
...
}
当你使用public User User = new User();
您只创建一个字段,其PropertyDescriptor
的IsReadOnly
属性将返回false
因此if
块中的代码永远不会执行, User.Email
值为null
( string
的默认值)
I want to know why it doesn't work if I had the code above looked like this instead:
public User User = new User();
因为基础结构会查找set
方法。 它需要是公共二传手的财产。
@Stephen提供的代码安静并没有描述问题的核心。 这是DefaultModelBinder
的方法,它尝试绑定模型的属性。
private void BindProperties(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
IEnumerable<PropertyDescriptor> properties = GetFilteredModelProperties(controllerContext, bindingContext);
foreach (PropertyDescriptor property in properties)
{
BindProperty(controllerContext, bindingContext, property);
}
}
在这里,我们看到GetFilteredModelProperties
试图通过方法调用TypeDescriptor.GetProperties
获取通过methos调用链最终得到的PropertyDescriptor
,它返回类型而不是字段的属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.