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

c# – 为什么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;
            }
        }
    }
}

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

解决方法

我不确定您使用的是哪个版本的MVC,但在MVC版本5.2.3中,DefaultModelBinder在调用控制器方法之前的绑定过程中在每个属性上设置请求值之前调用模型类getter.我无法弄清楚为什么会这样做,但我能够通过实现基于原始DefaultModelBinder源代码自定义模型绑定器来更改该行为,该源代码删除对getter的调用.

请在此处查看更详细的说明和完整解决方案:https://stackoverflow.com/a/54431404/10987278.

在您的评论中,您提到您已经拥有自定义模型绑定器,因此您可以只从我的解决方案中添加BindProperty(…)覆盖以获得您所追求的行为.

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

相关推荐