我应该在视图模型中使用此逻辑吗?

时间:2014-11-14 02:29:28

标签: c# asp.net asp.net-mvc

我正在使用ASP.NET MVC并且不确定我的视图模型中的逻辑是否合适。以下是示例模型视图:

class ViewModel {
    public string prop1 {get; set;}
    public string prop2 {get; set;}
    List<string> prop3 {get; set;}
        ..........  // more properties


    public ViewModel() {
        prop1 = DataModel.field1
        prop2 = DataModel.field2;

        prop3 = UtilityClass.complexFunction();
       ......
    }
}

问题是我的视图模型有很多属性,我想在控制器中初始化它们,但是在视图模型中封装属性的填充以保持控制器更精简似乎更清晰。如果我应该在控制器中执行此操作,那么基本原理是什么?我认为这种做法类似于:

ViewModel model = new ViewModel() {prop1 = DataModel.prop, prop3 = UtilityClass.complexFunction()}

4 个答案:

答案 0 :(得分:1)

控制器应该像你想的那样实例化ViewModel对象:

ViewModel model = new ViewModel() {prop1 = DataModel.prop, prop3 = UtilityClass.complexFunction()};

通过这样做,ViewModel类现在没有像您的其他方法那样耦合到类 DataModel UtilityClass 。现在,ViewModel类可以独立工作,而无需了解任何有关DataModel或UtilityClass的信息。这有助于ViewModel类更容易测试。

答案 1 :(得分:0)

在Controller中声明这些属性是不正确的。

当您使用MVC时。你应该有3个不同的层。 所以你的代码应该分成Model

  class Model
  {
   public string prop1 {get; set;}
   public string prop2 {get; set;}
   List<string> prop3 {get; set;}
   // more properties
  }

控制器应该只负责绑定您的视图和模型

class ViewModel 
{
  //Use Instance of Model in here
  public ViewModel() // OR pass model as dependency injection 
                     //so that you can use it for Unit Testing 
  {
    prop1 = DataModel.field1
    prop2 = DataModel.field2;

    prop3 = UtilityClass.complexFunction();
    ......
    //Do not put this Conversion of DataModel to Model assignment logic in 
    //View Model's constructor write mapper file or something to convert Data Model to Model   
  }
}

答案 2 :(得分:0)

继承模型怎么样?

public class ModelAddress
{
    public String Line1 { get; set; }
    public String Line2 { get; set; }
    public String City { get; set; }
    public String State { get; set; }
    public String Zip { get; set; }

}

public class ViewModelAddress : ModelAddress
{
    public WhizzyWhig WW { get; set; }
    public FancyWhatzitUIProperty FwUp { get; set; }

    public ViewModelAddress(ModelAddress copy)
    {
        this.Line1 = copy.Line1;
        this.Line2 = copy.Line2;
        this.City = copy.City;
        this.State = copy.State;
        this.Zip = copy.Zip;
    }
}

答案 3 :(得分:0)

通常,模型用于使用实体框架创建数据库类(数据模型),实体框架用于在数据库中生成表。

通过asp.net中的模型mvc View我们指的是我们要绑定的类(视图模型)。这可以是与视图模型类似的相同数据模型类,如果没有任何新函数要为该视图添加以解析等数据,则可以创建其他视图模型以与视图绑定。 从数据库获取的所有内容都在模型中使用,而在视图模型中,您可以解析该数据或执行某些操作以与视图绑定。

以下是使用这两种模型的方法。

class Student {
            //DataModel
}

class StudentViewModel{
  public Student stu = null;

  public StudentViewModel(Student s){this.stu = s;}

  public void DoParseOrSomeFuntionHere(){}
}