【问题标题】:How to send model data to a view through a controller in MVC C#如何通过 MVC C# 中的控制器将模型数据发送到视图
【发布时间】:2018-03-27 21:08:49
【问题描述】:

我已经看到了很多不同的 MVC 架构。他们都是不同的。 我想知道使用控制器将模型数据发送到视图的标准方法。 是否适合将模型对象发送到视图并使用一个设置器设置视图字段?还是使用多个setter一个参数或其他方式一一设置视图字段?

public class View{
    public void SetField1(int value){
      //...
    }
    public void SetField2(string text){
      //...
    }
    public void SetField3(Time time){
      //...
    }
    //or
    public void SetContent(Model model){
       //...
    }
}

public class Model{
   public int _value;
   public string _text;
   public Time _time;

   public Model(int value,string text,Time time){
     //...
   }
}

public class Controller{
   Model _model;
   View _view;

   public Controller(){
      _model=new Model();
      _view=new View();
   }
   public void SetModel(Model model){
      _model=model;
      SetContentView();
   }
   public void SetView(View view){
      _view=view;
   }
   public void SetContentView(){
      _view.SetField1(_model._value);
      _view.SetField2(_model._text);
      _view.SetField3(_model._time);
      //or
      _view.SetContent(_model); // the view can not be decoupled with model!
   }
} 

【问题讨论】:

  • 看不到您上面发布的代码和asp.net-mvc 架构之间的任何链接。看来您的问题与asp.net-mvc 完全无关,这是重点吗?如果是这样,也许可以删除这些标签?如果这不是重点,那么您应该首先阅读asp.net-mvc 的实际工作原理。
  • 您的代码示例与 ASP.NET MVC 的实际工作方式几乎没有关系。我建议您在 YouTube / MS Virtual Academy / etc 中搜索ASP.NET MVC tutorial。这个网站不是提供大量教程的地方。

标签: c# model-view-controller architecture code-maintainability


【解决方案1】:

您可以创建一个 ModelView 对象,该对象明确定义视图所需的属性。然后,您可以定义一个 Mapper 类,负责将服务器端模型映射到客户端模型,从而将视图与服务器模型解耦。

从你的例子:

public class Controller{
   Model _model;
   View _view;
   Mapper _mapper;

   public Controller(){
      _model=new Model();
      _view=new View();
      _mapper = new ViewModelMapper();

   }

   public void SetContentView(){
      _view.SetContent(_mapper.map(_model));
   }
} 

我对它们没有太多经验,但确实存在旨在使这不那么乏味的框架:http://automapper.org/

【讨论】:

  • 我想了解设计和架构,并通过解耦而不是框架来清洁代码
  • _mapper.map(_model),它返回一个客户端模型?所以视图取决于客户端模型。不通过基于可维护性的模型单独设置字段不是更好吗?
  • 无论有没有映射框架,架构都是一样的。不同之处在于,如果没有框架,您将需要定义一个类来处理映射步骤。您可能需要执行每个模型->视图模型转换一个映射类。
  • 是的,_mapper.map(_model) 会返回一个视图模型。视图将始终绑定到某些东西,无论是单个对象还是一堆单独的字段,关键是您希望能够将域模型与视图解耦。这就是映射为您所做的。例如,如果您在模型中添加视图不需要的字段,则无需更改视图中的任何内容。
  • 我已经更新了示例,以便不使用泛型。 ViewModelMapper 是一个显式实现,旨在将 Model 类型的对象映射到 ViewModel 类型的对象。如果您有其他模型和视图,它们将需要类似的映射对象来处理它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多