繁体   English   中英

将模型属性映射到控制器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM