相关疑难解决方法(0)

为什么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[] {','});
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

它是'base.OnModelUpdated'行导致触发此错误.

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

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

这篇文章非常值得一读 - 但是根本没有提到readonly属性(不是我期望的).问题(如果有的话)可能比这种情况更广泛 - 我只是不确定是否有任何反复 - …

asp.net-mvc modelbinders asp.net-mvc-2

21
推荐指数
1
解决办法
5261
查看次数

为什么asp.net mvc 模型活页夹读取视图模型属性?

当我在视图模型中的属性的 getter 上放置断点时,asp.net 核心模型绑定正在读取我的属性值。这是在实际视图中使用视图模型之前。这样做有什么理由吗?模型绑定应该用于从值提供者设置视图模型上的属性,而不是从视图模型中读取它们。有没有办法防止这种情况?

编辑:由于没有提供轻松复制的步骤,因此投票结束此问题,因此它们在这里。在 asp.net 核心项目中创建以下控制器:

public class TestController : Controller
{
    public IActionResult Test(TestViewModel model)
    {
        return View(model);
    }

    public class TestViewModel
    {
        public string TestProperty
        {
            get
            {
                return "";
            }

            set
            {
                return;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您将断点放在 getter 中,并在测试控制器操作中设置一个断点,您将看到 getter 在它实际进入控制器操作以供视图使用之前被访问。此时似乎不应该读取视图模型中的属性。只需寻找有关为什么会发生这种情况的想法,以及是否有可能(或一个好主意)来防止这种行为。谢谢!

c# asp.net-mvc asp.net-core

5
推荐指数
1
解决办法
588
查看次数