【问题标题】:How does ASP.NET MVC know how to fill your model to feed your Controller's Action? Does it involve reflection?ASP.NET MVC 是如何知道如何填充模型以提供控制器的操作的?它涉及反射吗?
【发布时间】:2011-02-16 11:35:35
【问题描述】:

已经定义了Model

public class HomeModel {
    [Required]
    [Display(Name = "First Name")]
    public string FirstName { get; set; }

    [Required]
    [Display(Name = "Surname")]
    public string Surname { get; set; }
}

并拥有以下Controller

public class HomeController : Controller {
    [HttpPost]
    public ActionResult Index(HomeModel model) {
        return View(model);
    }

    public ActionResult Index() {

        return View();
    }
}

通过某种“魔法”机制,HomeModel model 被 ASP.NET MVC 填充了值。有人知道怎么做吗?

从一些基本测试来看,它似乎会查看 POST 响应并尝试将响应对象名称与您的模型属性相匹配。但要做到这一点,我猜它必须使用反射?这不是很慢吗?

谢谢

【问题讨论】:

    标签: c# .net asp.net asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    是的,你说的是魔法ModelBinder

    ModelBinder 负责创建模型并使用来自表单回发的值对其进行水合,并执行验证,其结果将显示在 ModelState 中。

    默认实现是DefaultModelBinder,但您可以自己插入。

    【讨论】:

      【解决方案2】:

      DefaultModelBinder 确实使用反射来设置模型的属性。更具体地说,它使用 PropertyDescriptor 类的SetValue 方法。当然,您始终可以创建custom model binder 以避免反射。

      【讨论】:

        猜你喜欢
        • 2011-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-02
        • 2018-12-27
        • 1970-01-01
        • 2023-03-04
        相关资源
        最近更新 更多