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
}