在.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这样的外部工具吗?
这是由模型绑定器完成的。(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部分。