[英]Mapping Model Properties into Controller
我整天都在寻找问题的解决方案,但没有发现任何可以接受的...
我的项目是使用MVC模式构建的,我不确定是否可以使视图直接访问模型。 据我所知,它旨在从视图中“隐藏”模型并将控制器用作“代理”。
我给你看一个例子来更好地理解我的问题。
该模型:
internal class ExampleModel
{
public Size GridSize {get; set;}
//a lot more properties
//...
//business logic
}
控制器:
internal class ExampleController
{
private ExampleModel m_Model;
//Logic "proxy" with some extensions
//A lot of functions
//--------------------
//Mapping the model's properties
public Size GridSize
{
get
{
return m_Model.GridSize;
}
set
{
m_Model.GridSize = value;
}
}
//A lot more properties, mapping the ones from the model
}
所以我的问题是:如何将模型的属性自动映射到控制器? 因为“同步”模型和控制器之间的属性很烂? :P还是我可以将m_Model公开? 我真的不知道该怎么办..
提前致谢 :)
通常,您会在控制器动作中将模型返回时将模型传递到视图中。
public class HomeController
{
public ActionResult Index()
{
// Do something with model here, in this example we are creating a new model
var model = new Model();
// Send the model to the view, this is then available as @Model
return View(model);
}
}
请注意,您的视图可能还会包含其他属性,这些属性要求您不要污染模型。 在这种情况下,您可以创建一个视图模型,该视图模型将使用其他属性来扩充您的模型。 您的视图模型通常包含对模型的引用。
一些纯粹主义者不喜欢将模型暴露给视图,因此此链接提供了一些其他方法:
http://blogs.msdn.com/b/simonince/archive/2010/01/26/view-models-in-asp-net-mvc.aspx
devdigital的答案是正确的,您不应该真正通过控制器公开您的模型(在设计方面,它迫使您的View知道某些有关控制器的知识,这超出了目的...)。 您的控制器应准备好View所需的所有数据,并在创建ViewResult时将其传递(这是默认View名称的return View(model)
所做的事情)。
但是,您还询问是否有更好的方法在对象之间映射属性。 我认为devdigital的链接没有提到此特定工具(但确实提到了映射器):AutoMapper( http://automapper.codeplex.com/ )。
首先,您在2种任何类型的实体/模型/对象之间配置一个Map。 默认行为是简单地分配具有相同名称的属性,但是您可以配置为忽略属性或自定义值分配。
AutoMapper.Mapper.CreateMap<ExampleEntity, ExampleModel>();
那你就用它...
ExampleModel model = AutoMapper.Mapper.Map<ExampleModel>(myEntity);
不过,这将适用于1:1实体映射。 如果您实际上是在扩展ViewModel(我通常会使用ViewModel为视图提供来自不同实体或来源的数据),则我不建议使用AutoMapper。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.