加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么asp.net mvc模型绑定器读取视图模型属性?

发布时间:2020-12-15 21:01:29 所属栏目:百科 来源:网络整理
导读:当我在视图模型中的属性的getter上放置断点时,asp.net核心模型绑定正在读取我的属性值.这是在实际视图中使用视图模型之前.有没有理由这样做?模型绑定应该用于从值提供程序设置视图模型的属性,而不是从视图模型中读取它们.有办法防止这种情况吗? 编辑:由于
当我在视图模型中的属性的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(…)覆盖以获得您所追求的行为.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读