我正在使用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()}
答案 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(){}
}