C# 在.NETMVC控制器上,映射是什么?

C# 在.NETMVC控制器上,映射是什么?,c#,asp.net-mvc,C#,Asp.net Mvc,因此,我有一个动作方法,它采用了一个奇特的Cart对象: [HttpPost] public JsonResult BuildTransaction(Cart cart) { } 购物车型号: public class Cart { public Guid UserId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public A

因此,我有一个动作方法,它采用了一个奇特的
Cart
对象:

[HttpPost]
public JsonResult BuildTransaction(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类型的cart可玩。太棒了

我的问题是,.NET如何进行这种映射?我想象它在
OnActionExecute
中的某个地方,但它是如何做到的


如果我想模仿这个功能,我会怎么做?如果MVC似乎完全可以在没有AutoMapper的情况下使用它,那么我真的需要像AutoMapper这样的外部工具吗?

这是由模型绑定器完成的。(
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;

     }
}
更多信息: 第一个MVC收到一个post(例如),其中包含您的html
输入值以及与每个值关联的
名称

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

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


这是关于如何使用AutoMapper的,在这里您不需要它。

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


如果您想了解更多关于何时发生模型绑定的信息,请详细介绍MVC管道。如果您只是想了解更多关于模型绑定的知识,我发现这本两页的教程非常有帮助。

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

  • HttpPostedFiledModelBinder
  • ByteArrayModelBinder
  • LinqBinaryModelBinder
您还可以创建自己的绑定,并将它们与@Mansfield所指出的参数属性的参数相关联。但是,您也可以按如下方式为特定类型全局注册它们(例如,在
应用程序\u Start
中)

如果出于某种原因,你想重新发明轮子,你也可以改变deDefaultModelBinder

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
}

MVC模型绑定。您可以自由检查codeplex中提供的源代码。
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
}