c# - 为什么 asp.net mvc 模型 Binder 读取 View 模型属性?

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

当我在我的 View 模型中的属性的 getter 上放置断点时,asp.net 核心模型绑定(bind)正在读取我的属性值。这是在实际 View 中使用 View 模型之前。它这样做是有原因的吗?模型绑定(bind)应该用于从值提供程序设置 View 模型上的属性,而不是用于从 View 模型中读取它们。有办法避免这种情况吗?

编辑:由于没有提供轻松重现的步骤,因此投票结束了这个问题,所以他们在这里。在 asp.net core 项目中创建以下 Controller :

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

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

            set
            {
                return;
            }
        }
    }
}

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

最佳答案

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

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

在您的评论中,您提到您已经有一个自定义模型联编程序,因此您可以只添加 BindProperty(...) 从我的解决方案中覆盖以获得您想要的行为.

关于c# - 为什么 asp.net mvc 模型 Binder 读取 View 模型属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38799898/

相关文章:

c# - sql 在一个字符串匹配上连接两个表

c# - 在 Renci SSH.NET 中启动自定义 SSH 子系统(相当于 ch.ethz ssh2.Session.StartSubSystem())

c# - 避免在 View 中添加 if/else 逻辑

c# - 下载 Excel 文件

Angular SignalR 和 Windows 身份验证 (NTLM)

c# - 如何在 ASP.NET Core 路由规则中添加前导零?

C#拖放问题

c# - 如何在 C# PowerShell Cmdlet 中动态定义类

asp.net-mvc - Orchard CMS : Content part not displayed

c# - 不允许使用 ASP.NET Core 2.2 WebAPI 405 方法