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

Jer*_*ong 5 c# asp.net-mvc asp.net-core

当我在视图模型中的属性的 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 在它实际进入控制器操作以供视图使用之前被访问。此时似乎不应该读取视图模型中的属性。只需寻找有关为什么会发生这种情况的想法,以及是否有可能(或一个好主意)来防止这种行为。谢谢!

小智 1

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

在这里查看更详细的解释和我的完整解决方案: https: //stackoverflow.com/a/54431404/10987278

在您的评论中,您提到您已经有一个自定义模型绑定器,因此您可能只需添加BindProperty(...)我的解决方案中的覆盖即可获得您想要的行为。