繁体   English   中英

之间的区别

[英]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(); 您只创建一个字段,其PropertyDescriptorIsReadOnly属性将返回false因此if块中的代码永远不会执行, User.Email值为nullstring的默认值)

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM