gpt4 book ai didi

asp.net-mvc - 为什么 ASP.NET MVC 在数据绑定(bind)期间关心我的只读属性?

转载 作者:行者123 更新时间:2023-12-03 11:56:53 26 4
gpt4 key购买 nike

编辑:添加赏金,因为我正在寻找除此之外的 MVC3 解决方案(如果存在):

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

我的“地址”模型有一个只读属性 'CityStateZip' .

这只是从美国地址获取城市、州、 zip 的便捷方式。如果国家不是美国,它会抛出异常(调用者应该首先检查)。

    public string CityStateZip
{
get
{
if (IsUSA == false)
{
throw new ApplicationException("CityStateZip not valid for international addresses!");
}

return (City + ", " + StateCd + " " + ZipOrPostal).Trim().Trim(new char[] {','});
}
}

这是我模型的一部分,所以它被绑定(bind)了。在 ASP.NET MVC2 RC2 之前,此字段在数据绑定(bind)期间从未引起问题。我什至从未真正想过它——毕竟它只是只读的。

现在虽然在 2010 年 1 月的 RC2 版本中,它在数据绑定(bind)期间给了我一个错误 - 因为默认模型绑定(bind)器似乎想要检查这个值(即使它是只读的)。

触发此错误的是“base.OnModelUpdated”行。
public class AddressModelBinder : DefaultModelBinder
{
protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
base.OnModelUpdated(controllerContext, bindingContext);

模型绑定(bind)器的最后几分钟更改显然导致了这种行为变化 - 但我不太确定它的后果是什么 - 或者这是否是一个错误?我正在将此传递给 MVC 团队,但好奇是否有人在此期间有任何建议如何防止此属性绑定(bind)。

这篇文章非常值得一读有关这些更改的内容——但根本没有提到只读属性(不是我期望的那样)。问题(如果有的话)可能比这种情况更广泛 - 我只是不确定是否有任何反击 - 如果有的话!

Input Validation vs. Model Validation in ASP.NET MVC

根据@haacked 的要求,这是堆栈跟踪:

我只需将以下行添加到 ANY 模型并发布到相应的操作方法即可。在这种情况下,我将它添加到我最简单的模型中。
 public string Foo { get { throw new Exception("bar"); } }

[TargetInvocationException: Property accessor 'Foo' on object 'Rolling_Razor_MVC.Models.ContactUsModel' threw the following exception:'bar'] System.ComponentModel.ReflectPropertyDescriptor.GetValue(Object component) +390 System.Web.Mvc.<>c__DisplayClassb.<GetPropertyValueAccessor>b__a() +18 System.Web.Mvc.ModelMetadata.get_Model() +22 System.Web.Mvc.ModelMetadata.get_RealModelType() +29 System.Web.Mvc.<GetValidatorsImpl>d__0.MoveNext() +38 System.Linq.<SelectManyIterator>d__14`2.MoveNext() +273 System.Web.Mvc.<Validate>d__5.MoveNext() +644 System.Web.Mvc.DefaultModelBinder.OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) +92 System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Object model) +60 System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +1048 System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +280 System.Web.Mvc.Controller.TryUpdateModel(TModel model, String prefix, String[] includeProperties, String[] excludeProperties, IValueProvider valueProvider) +449 System.Web.Mvc.Controller.TryUpdateModel(TModel model) +73

最佳答案

我相信我遇到了类似的问题。我已经发布了详细信息:

http://forums.asp.net/t/1523362.aspx

编辑 :来自 MVC 团队的回应(来自上述 URL):

我们对此进行了调查并得出结论,验证系统的行为符合预期。由于模型验证涉及尝试对所有属性运行验证,并且由于不可为空的值类型属性具有隐式 [Required] 属性,因此我们正在验证此属性并在此过程中调用它的 getter。我们知道这是对产品 V1 的重大更改,但有必要使新的模型验证系统正常运行。

您有几个选项可以解决此问题。这些中的任何一个都应该起作用:

  • 将 Date 属性改为方法而不是属性;这样它将被 MVC 框架忽略。
  • 将属性类型更改为 DateTime?而不是日期时间。这会从此属性中删除隐含的 [Required]。
  • 清除静态 DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes 标志。这从应用程序范围内的所有不可空值类型属性中删除了隐含的 [Required]。
    我们正在考虑在产品的 V3 中添加一个属性,该属性将向我们发出“不要绑定(bind)它,不要验证它,只是假装这个属性不存在”的信号。

  • 再次感谢您的报告!

    关于asp.net-mvc - 为什么 ASP.NET MVC 在数据绑定(bind)期间关心我的只读属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2211829/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com