【问题标题】:Mapping Model Properties into Controller将模型属性映射到控制器
【发布时间】:2012-03-27 20:43:50
【问题描述】:

我整天都在寻找解决问题的方法,但没有找到任何可以接受的...

我的项目是使用 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 吗?我真的不知道该怎么办..

提前谢谢:)

【问题讨论】:

  • 您是否尝试过任何在线可用的教程,您肯定会在搜索一整天时遇到?
  • 我在一个计算机科学项目中广泛地训练了 MVC 模式。但是在那里我们暴露了模型。我真的不确定这是否可以。
  • 如果您在 MVC 上接受的培训直接将模型暴露在视图中,那么您应该要求退款...
  • 不,不是直接... 对模型的唯一引用是在控制器中。但公开可见。而这正是让我绝望的东西......

标签: c# model-view-controller model properties mapping


【解决方案1】:

通常,您会将模型传递到视图中,然后在控制器操作中返回它。

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

【讨论】:

  • 那么模型公开就可以了?如果是,那我就放心了;)
  • 如果将其公开意味着将其直接暴露给视图,那么这是人们使用的一种方法。请记住,最终目标始终是生成简单、干净、优雅且可维护的代码,因此请选择能够为您实现这一目标的方法。
  • 我建议在做出决定之前调查该链接中提到的所有方法。
  • 我目前正在研究它。使用视图模型似乎也是一种非常有趣的方法来简化我的程序结构。
【解决方案2】:

devdigital 的answer 是正确的,您不应该真正通过控制器公开您的模型(在设计方面,它迫使您的视图了解有关控制器的一些信息,这超出了目的......)。 您的控制器应该准备好您的视图需要的所有数据,并在创建 ViewResult 时将其传递(这是 return View(model) 为默认视图名称所做的)。

但是,您还询问是否有更好的方法来映射对象之间的属性。我不认为 devdigital 的链接提到了这个特定的工具(但它确实提到了映射器):AutoMapper (http://automapper.codeplex.com/)。

您首先在 2 个任意类型的实体/模型/对象之间配置一个映射。默认行为将简单地分配具有相同名称的属性,但您可以配置为忽略属性,或自定义值分配。

AutoMapper.Mapper.CreateMap<ExampleEntity, ExampleModel>();

那你就用它吧……

ExampleModel model = AutoMapper.Mapper.Map<ExampleModel>(myEntity);

这适用于 1:1 实体映射。如果您实际上是在扩充 ViewModel,我不建议您使用 AutoMapper(ViewModel 是您用来为视图提供通常来自不同实体或来源的数据的视图)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多