微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

DataAnnotationsModelValidatorProvider.AddImplicitrequiredAttributeForValueTypes = false;

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

这是从美国地址获取城市,州,邮政编码的便捷方式。如果国家不是美国,则会引发异常(呼叫者应先检查)。

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

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

这是我的模型的一部分,所以它受到约束。在ASP.NET MVC2 RC2之前,该字段在数据绑定期间从未引起问题。我从来没有想过它 – 毕竟只是只读。

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

它是’base.OnModelUpdated’行,导致此错误被触发。

public class AddressModelBinder : DefaultModelBinder
{
    protected override void OnModelUpdated(ControllerContext controllerContext,ModelBindingContext bindingContext)
    {
        base.OnModelUpdated(controllerContext,bindingContext);

模型绑定的最后几分钟更改明显地导致了行为的这种变化 – 但是我不太清楚它的后果是什么 – 或者这是否是一个错误?我把这个传递给了MVC团队,但好奇的是,如果其他人有任何建议,同时我如何可以防止这个属性绑定。

这篇文章非常值得阅读有关这些变化 – 但是根本没有提到只读属性(不是我期望的)。这个问题(如果有的话)可能比这种情况更广泛 – 我不知道有什么后果 – 如果有的话!

Input Validation vs. Model Validation in ASP.NET MVC

根据@haacked的要求,这里是stacktrace:

我通过简单地将以下行添加到任何模型,并发布到相应的操作方法在这种情况下,我把它添加到我最简单的模型中。

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):

我们调查了这一点,并得出结论,验证系统的行为是按预期的。由于模型验证涉及尝试在所有属性上运行验证,并且由于非可空值类型属性具有隐式[必需]属性,因此我们将在该过程中验证此属性调用其getter。我们了解到,这是从V1产品的突破性变化,但是必须使新型号验证系统正常运行。

你有几个选择可以解决这个问题。其中任何一个应该工作:

>将Date属性更改为方法而不是属性;这样就可以被MVC框架忽略了。
>将属性类型更改为DateTime?而不是DateTime。这将从此属性删除隐式[必需]。
>清除静态DataAnnotationsModelValidatorProvider.AddImplicitrequiredAttributeForValueTypes标志。这从应用程序范围内的所有非可空值类型属性中移除隐式[必需]。
我们正在考虑在V3中添加一个属性,该信号将向我们发出信号,“不要绑定它,不要验证它,只是假装该属性不存在”。

再次感谢报告!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“WPF...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这...
Some samples are below for ASP.Net web form controls:(from http://www.visualize.uk.com/resources/asp
问题描述: 对于未定义为 System.String 的列,唯一有效的值是(引发异常)。 For columns not defined as System.String, the only vali
最近用到了CalendarExtender,结果不知道为什么发生了错位,如图在Google和百度上找了很久,中文的文章里面似乎只提到了如何本地化(就是显示中文的月份)以及怎么解决被下拉框挡住的问题,谈
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence changed a lot since 1.1. Here is the order: App
静态声明: &#39; Style=&quot;position: relative&quot; AppendDataBoundItems=&quot;True&quot;&gt; (无 或 空 或
以下内容是从网络上搜集资料,然后整理而来的。不当之处,请不吝指教。(The following were from network, and edited by myself. Thanks in a
Imports System Imports System.Reflection Namespace DotNetNuke &#39;*********************************
Ok so you have all seen them: “8 million tools for web development”, “5 gagillion tools that if you