输入模型和视图模型,你分开吗? C#

时间:2015-08-13 12:58:26

标签: c# asp.net-mvc oop

我有一些模型,例如:RequestModel

public class RequestModel
{
    public int RequestId { get; set; }

    public int CategoryKey { get; set; }
    public int SubCategoryKey { get; set; }
    public int AreaKey { get; set; }   
}

我用这个模型从一些html表单中获取输入。

CategoryKeySubCategoryKeyAreaKey是“类别”,“子类别”和“区域”值的代码。

出于展示目的,我需要展示CategoryValueSubCategoryValueAreaValue。所以我在View中使用了相同的模型,并在其中添加了三个字段。

public class RequestModel
{
    public int RequestId { get; set; }

    public int CategoryKey { get; set; }
    public int SubCategoryKey { get; set; }
    public int AreaKey { get; set; }

    public String CategoryValue { get; set; }
    public String SubCategoryValue { get; set; }
    public String AreaValue { get; set; }
}

我正在考虑将它与以下类分开:

public class RequestModel
{
    public int RequestId { get; set; }
}

public class RequestInputModel : RequestModel
{
    public int CategoryKey { get; set; }
    public int SubCategoryKey { get; set; }
    public int AreaKey { get; set; }
}

public class RequestDisplayModel : RequestModel
{
    public int RequestId { get; set; }
    public String CategoryValue { get; set; }
    public String SubCategoryValue { get; set; }
    public String AreaValue { get; set; }
}
你怎么看?真的有必要吗?你是否在类之间进行输入和显示类的分离?

1 个答案:

答案 0 :(得分:1)

通用最佳实践是您在模型中拥有数据。即,您需要保存到文件或数据库的信息,然后在视图模型上有您的业务逻辑,这就像Fullname是First + Surname之类的东西,所以需要显示但不保存的数据 然后,您可以在顶部查看格式和样式输出

所以你会有

public class PersonModel
{
    string firstName;
    string Surname;
    DateTime DateOfBirth
}
public class PersonDisplayViewModel
{
    PersonModel Model;
    string FullName
    {
        get{return Model.firstname + " " + Model.Surname;}
    }
    int Age
    {
        get{return (DateTime.Today() - Model.DateOfBirth).TotalYears;}
    }
}
public class PersonEditViewModel
{
    PersonModel Model;
    string FirstName {
        get{return Model.FirstName;}
        set{Model.FirstName = value;}
    }
    string Surname{
        get{return Model.Surname;}
        set{Model.Surname= value;}
    }
    DateTime DateOfBirth{
        get{return Model.DateOfBirth;}
        set{Model.Surname= DateOfBirth;}
    }

}

原因是相同的核心数据可能会在很多地方使用,例如,您有一个显示全名和年龄的搜索屏幕以及一个编辑屏幕,可让您编辑姓名和出生日期。他们拥有与人相同的核心数据,但他们以不同的方式呈现数据。还说你正在为学校做点什么,并希望确保学生年龄<16岁,但你也必须有> 18岁的员工。你不能把这个年龄过滤器放在人模型上,因为一个人可以是任何年龄,但是在视图模型上非常适合定义可以和不能写入下面模型的模型

如果您在美国有自己的应用程序版本,并希望使用美国日期格式,即mm-dd-yyyy但是英国的相同应用程序需要dd-mm-yyyy格式,这对视图也是如此对底层数据或业务逻辑的任何影响?不,它只是改变数据的外观,所以在veiw