.NET MVC - 在视图模型中使用组合

时间:2015-07-10 21:04:46

标签: asp.net-mvc viewmodel composition

我试图围绕作曲的想法。从来没用过它。我有一个看起来像这样的课程(精简版):

    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();

错误:{"对象引用未设置为对象的实例。"}

我没有想法。谢谢!

3 个答案:

答案 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,那么它将创建一个引用/返回现有引用,但如果它没有被使用,那么就没有创建引用。