我试图围绕作曲的想法。从来没用过它。我有一个看起来像这样的课程(精简版):
public class AccountProfile
{
public string AccountNumber { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public void GetAccountProfile()
{
AccountNumber = "123456"; // eventual these will become values from the database
FirstName = "John";
LastName = "Smith";
}
}
然后,在我的视图模型中,我希望能够访问AccountNumber,FirstName和LastName。我不想使用继承,因为这个视图模型需要访问多个外部的,不相关的类。到目前为止,模型很简单:
public class AccountProfileViewModel
{
public AccountProfileViewModel() { }
}
这是我迄今为止尝试过的,没有一个是正确的:
public class AccountProfileViewModel
{
AP= new AccountProfile();
public AccountProfileViewModel() { }
}
那个(上面)抛出多个错误并且不会编译。我也试过这个:
public class AccountProfileViewModel
{
public AccountProfile AP { get; set; }
public AccountProfileViewModel() { }
}
这个(上面的那个)编译得很好,但是当我尝试使用它时,它会在控制器中抛出运行时错误:
model.AP.GetAccountProfile();
错误:{"对象引用未设置为对象的实例。"}
我没有想法。谢谢!
答案 0 :(得分:2)
你必须至少初始化对象。
public class AccountProfileViewModel
{
public AccountProfile AP { get; set; }
public AccountProfileViewModel() {
AP = new AccountProfile();
}
}
答案 1 :(得分:1)
我认为你想要实现的是这样的:
public class AccountProfileViewModel
{
public AccountProfile AP { get; set; }
public AccountProfileViewModel() { }
}
或AccountProfileViewModel
确实需要AccountProfile
你可以
public class AccountProfileViewModel
{
public AccountProfile AP { get; set; }
public AccountProfileViewModel(AccountProfile profile) {
this.AP = profile;
}
}
在控制器中你可以做这样的事情
public class controller {
public ActionResult Index(){
var vm = new AccountProfileViewModel();
var ap = //Get accountProfile
vm.AP = ap;
return View(vm);
}
}
或在您需要AccountProfile
public class controller {
public ActionResult Index(){
var ap = //Get accountProfile
var vm = new AccountProfileViewModel(ap);
return View(vm);
}
}
您希望AccountProfileViewModel
拥有AccountProfile
的实例,但您想在控制器中设置它。
然后在您的视图中,您可以执行Model.AP.AccountNumber
例如
答案 2 :(得分:0)
如果你需要这个类中的对象引用,那么我个人的偏好只是在需要的时候才创建对象:
public class AccountProfileViewModel
{
private AccountProfile _ap;
public AccountProfile AP
{
get { return _ap ?? (_ap = new AccountProfile()); }
set { _ap = value; }
}
}
如果您实际使用yourObject.AP
,那么它将创建一个引用/返回现有引用,但如果它没有被使用,那么就没有创建引用。