Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么asp.net mvc模型绑定器正在读取视图模型属性?_C#_Asp.net Mvc_Asp.net Core - Fatal编程技术网

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

C# 为什么asp.net mvc模型绑定器正在读取视图模型属性?,c#,asp.net-mvc,asp.net-core,C#,Asp.net Mvc,Asp.net Core,当我在视图模型中的属性的getter上放置断点时,asp.net核心模型绑定正在读取我的属性值。这是在实际视图中使用视图模型之前。它这样做有什么原因吗?模型绑定应该用于从值提供程序设置视图模型的属性,而不是从视图模型读取属性。有没有办法防止这种情况 编辑:由于没有提供易于复制的步骤,因此投票决定结束此问题,请看这里。在asp.net核心项目中创建以下控制器: public class TestController : Controller { public IActionResult T

当我在视图模型中的属性的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中放置断点,在testcontroller操作中放置断点,您将看到getter在实际进入视图要使用的控制器操作之前被访问。此时似乎不应该读取视图模型中的属性。只是想知道为什么会发生这种情况,以及是否有可能(或一个好主意)防止这种行为。谢谢

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

请在此处查看更详细的说明和我的完整解决方案:


在您的评论中,您提到您已经有了一个自定义模型绑定器,因此您可以从我的解决方案中添加
BindProperty(…)
override来获得您所追求的行为。

是:
这是在实际视图中使用视图模型之前。它这样做有什么原因吗?
实际上导致了问题?如果没有,那么这个问题就没有意义了。因此,如果这没有引起问题,那么解决方案解决了什么?对不起,是的,这给我们带来了问题。我们的许多属性在模型绑定完成后返回基于内容的结果。例如,如果我们有一个名为CustomerID的属性,另一个延迟加载的属性名为CustomerOrders,那么当CustomerID在模型绑定期间还没有被水合,或者backing字段设置为无效数据时,我们不希望有东西访问CustomerOrders。我们可以将这些更改为私人支持的方法,但我只是想弄清楚为什么这是一个问题,以及是否有一种简单的方法可以防止它,以便我们可以更灵活地使用我们的属性。请原谅我的无知,但为什么您会喜欢这样的事情?ASP.NET(Core)MVC中的视图模型仅仅是为视图准备数据以供使用或为控制器准备视图输入的数据结构。与使用MVVM模式的WPF不同,视图模型中几乎没有使用“表示”逻辑,就像在控制器中那样。在这件事上做起来似乎很奇怪context@Tseng--您所描述的是最佳实践,但没有什么可以阻止您在ASP.NET MVC中使用具有逻辑的类作为viewmodel。我试图使我的“可复制示例”非常简单,在我们的实际解决方案中,我们有一个自定义模型绑定器,它使用我们的服务容器获取绑定数据,并使用注入的服务解析视图信息。我们在视图模型中执行此操作,因为在控制器级别执行构造函数注入没有那么集中/高效。这可能有点不正常,但不管怎样,我只是想弄明白为什么模型绑定需要从视图模型中读取属性,而理论上它应该只是调用setter将数据从值提供程序推送到它们中。