在.NET MVC控制器上,映射是什么

本文关键字:映射 是什么 控制器 NET MVC | 更新日期: 2023-09-27 18:16:20

所以我有一个操作方法,它采用了一个奇特的Cart对象:

[HttpPost]
public JsonResult BuildTransaction(Cart cart) { }

Cart模型:

public class Cart
{
    public Guid UserId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Address Address { get; set; }
}

我在路由上抛出了一些JSON,看起来像这样:

object cart = new {
            UserId = uid,
            FirstName = "John",
            LastName = "Travlota",                
            Address = new {
                Line1 = "Ramsdean Grange",
                Town = "boom town",
                PostCode = "dd7 7sx"
            }                
        };
var request = client.PostAsJsonAsync("BuildTransaction", cart);

结果,我在控制器中有一个cart类型的购物车可以玩。好极了

我的问题是,.NET是如何进行映射的?我想它在OnActionExecute中的某个位置,但它是如何做到这一点的。

如果我想模仿这个功能,我会怎么做?如果MVC似乎完全能够在没有AutoMapper的情况下做到这一点,我真的需要像AutoMapper这样的外部工具吗?

在.NET MVC控制器上,映射是什么

这是由模型绑定器完成的。(System.Web.Mvc.DefaultModelBinder(

您可以实现一个自定义模型绑定器,如下所示:

控制器:

public ActionResult Create([ModelBinder(typeof(CreateModelBinder))] CreateViewModel   vModel)
{
}

模型活页夹:

public class CreateModelBinder : DefaultModelBinder
{
     public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
     {
          //assign request parameters here, and return a CreateViewModel
          //for example
          CreateViewModel cVM = new CreateViewModel();
          cVM.Name = controllerContext.HttpContext.Request.Params["Name"];
          return cVM;
     }
}

更多信息:http://www.dotnetcurry.com/ShowArticle.aspx?ID=584https://stackoverflow.com/a/1249602/1324019

First MVC收到一个post(例如(,其中包含您的html input值以及与每个值关联的name

然后,它检查预期对象(模型类型(中的属性,并试图找到与接收到的表单匹配的name,依此类推

这一切都发生在ModelBinder中,您甚至可以更改它的执行方式,因为这是一个扩展点。

因此,这是关于如何使用AutoMapper的,以及关于使用它的,这里不需要它。

这是Mvc模型绑定。MVC有一组默认的模型绑定器。它使用DefaultModelBinder对象作为post请求的默认对象,但默认情况下也注册了以下3个对象。

  • HttpPostedFiledModelBinder
  • ByteArrayModelBinder
  • LinqBinaryModelBinder

正如@Mansfield所指出的,您也可以创建自己的绑定器,并将它们与具有参数属性的参数相关联。但是您也可以为特定类型全局注册它们,如下所示(例如在Application_Start中(

  //Register FooModelBinder for all posted objects that are of type Foo
  ModelBinders.Binders.Add(typeof(Foo),new FooModelBinder());

如果出于某种原因,你想重新发明轮子,你也可以更改de-DefaultModelBinder

ModelBinders.Binders.DefaultBinder = new CustomDefaultModelBinder();

以下是Foo型的ModelBinder的一个非常简单的实现

public class FooModelBinder: IModelBinder
{
    #region IModelBinder Members
    public object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext) {
        IUnvalidatedValueProvider provider = (IUnvalidatedValueProvider)bindingContext.ValueProvider;
        return new Foo {
            Bar = provider.GetValue("Bar", true).AttemptedValue,
            Banana= provider.GetValue("Banana", true).AttemptedValue
        };
    }
    #endregion
}

ASP.NET MVC模型绑定器是将请求参数转换为类实例的工具。只要您遵循默认约定(这意味着您的请求参数需要与类的属性名称相同(,这个伟大的功能就可以基于约定进行操作。所以,是的,在大多数情况下,默认的模型绑定器行为是可以的,您不需要像AutoMapper这样的库。

如果您想了解更多关于模型绑定何时发生的信息,本文将非常详细地介绍MVC管道。如果您只是想了解更多关于模型绑定的信息,我发现这篇两页的教程非常有帮助:第1部分和第2部分。