.NET MVC -- 使用 class 作为模型?
.NET MVC -- Use a class as the model?
在我的 MVC 应用程序中,多个视图模型几乎相同。我想我可以创建一个 class 而不是每次都复制模型。我不确定的是如何在每个模型中包含 class。
例如,假设我的模型如下所示:
public class AccountProfileViewModel
{
public string FirstName { get; set; }
public string Lastname { get; set; }
public AccountProfileViewModel() { }
}
但我知道 FirstName 和 LastName 将在许多模型中广泛使用。因此,我创建了一个包含 AccountProfile 的 class 库:
namespace foobar.classes
{
public class AccountProfile
{
public string FirstName { get; set; }
public string Lastname { get; set; }
}
}
回到模型中,我如何包含 class,以便 FirstName 和 LastName 在模型中,但不是专门创建的?
创建一个 Base class,然后使用继承,您就可以访问这些公共属性。
public class AccountProfile
{
public string FirstName { get; set; }
public string Lastname { get; set; }
}
public class OtherClass : AccountProfile
{
//here you have access to FirstName and Lastname by inheritance
public string Property1 { get; set; }
public string Property2 { get; set; }
}
除了使用继承,您还可以使用组合来实现相同的目标。
见Prefer composition over inheritance
它会是这样的:
public class AccountProfile
{
public string FirstName { get; set; }
public string Lastname { get; set; }
}
public class AccountProfileViewModel
{
// Creates a new instance for convenience
public AnotherViewModel() { Profile = new AccountProfile(); }
public AccountProfile Profile { get; set; }
}
public class AnotherViewModel
{
public AccountProfile Profile { get; set; }
public string Property1 { get; set; }
public string Property2 { get; set; }
}
您也可以实现一个接口,如 IProfileInfo
,这可能更可取,因为 classes 可以实现多个接口,但只能继承一个 class。将来您可能希望在需要继承的代码中添加一些其他统一方面,但您可能不一定想要一些 class 继承自具有 Firstname 和 Lastname 属性的基 class .如果您使用 visual studio,它会自动为您实现接口,因此您无需付出额外的努力。
public class AccountProfile : IProfileInfo
{
public string FirstName { get; set; }
public string Lastname { get; set; }
}
public interface IProfileInfo
{
string Firstname {get;set;}
string Lastname {get;set;}
}
评论太长了,所以这只是基于您已经收到的答案的评论。
只有当您创建的新 class 基本上是相同类型的对象,只是略有不同时,您才应该使用继承。如果您尝试将 2 个单独的 class 关联在一起,则应使用 属性 方法。继承类似于
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DOB { get; set; }
}
public class Teacher : Person
{
public string RoomNumber { get; set; }
public DateTime HireDate { get; set; }
}
public class Student : Person
{
public string HomeRoomNumber { get; set; }
public string LockerNumber { get; set; }
}
构图应该这样使用
public class Address
{
public string Address1 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
}
public class StudentViewModel
{
public StudentViewModel ()
{
Student = new Student();
Address = new Address();
}
public Student Student { get; set; }
public Address Address { get; set; }
}
在我的 MVC 应用程序中,多个视图模型几乎相同。我想我可以创建一个 class 而不是每次都复制模型。我不确定的是如何在每个模型中包含 class。
例如,假设我的模型如下所示:
public class AccountProfileViewModel
{
public string FirstName { get; set; }
public string Lastname { get; set; }
public AccountProfileViewModel() { }
}
但我知道 FirstName 和 LastName 将在许多模型中广泛使用。因此,我创建了一个包含 AccountProfile 的 class 库:
namespace foobar.classes
{
public class AccountProfile
{
public string FirstName { get; set; }
public string Lastname { get; set; }
}
}
回到模型中,我如何包含 class,以便 FirstName 和 LastName 在模型中,但不是专门创建的?
创建一个 Base class,然后使用继承,您就可以访问这些公共属性。
public class AccountProfile
{
public string FirstName { get; set; }
public string Lastname { get; set; }
}
public class OtherClass : AccountProfile
{
//here you have access to FirstName and Lastname by inheritance
public string Property1 { get; set; }
public string Property2 { get; set; }
}
除了使用继承,您还可以使用组合来实现相同的目标。
见Prefer composition over inheritance
它会是这样的:
public class AccountProfile
{
public string FirstName { get; set; }
public string Lastname { get; set; }
}
public class AccountProfileViewModel
{
// Creates a new instance for convenience
public AnotherViewModel() { Profile = new AccountProfile(); }
public AccountProfile Profile { get; set; }
}
public class AnotherViewModel
{
public AccountProfile Profile { get; set; }
public string Property1 { get; set; }
public string Property2 { get; set; }
}
您也可以实现一个接口,如 IProfileInfo
,这可能更可取,因为 classes 可以实现多个接口,但只能继承一个 class。将来您可能希望在需要继承的代码中添加一些其他统一方面,但您可能不一定想要一些 class 继承自具有 Firstname 和 Lastname 属性的基 class .如果您使用 visual studio,它会自动为您实现接口,因此您无需付出额外的努力。
public class AccountProfile : IProfileInfo
{
public string FirstName { get; set; }
public string Lastname { get; set; }
}
public interface IProfileInfo
{
string Firstname {get;set;}
string Lastname {get;set;}
}
评论太长了,所以这只是基于您已经收到的答案的评论。
只有当您创建的新 class 基本上是相同类型的对象,只是略有不同时,您才应该使用继承。如果您尝试将 2 个单独的 class 关联在一起,则应使用 属性 方法。继承类似于
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DOB { get; set; }
}
public class Teacher : Person
{
public string RoomNumber { get; set; }
public DateTime HireDate { get; set; }
}
public class Student : Person
{
public string HomeRoomNumber { get; set; }
public string LockerNumber { get; set; }
}
构图应该这样使用
public class Address
{
public string Address1 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
}
public class StudentViewModel
{
public StudentViewModel ()
{
Student = new Student();
Address = new Address();
}
public Student Student { get; set; }
public Address Address { get; set; }
}