2016-03-09 17 views
1

我有两个ViewModels如何在动作中绑定viewmodel子类的值?

CreateEventViewModel 
CreateAccountViewModel 

CreateEventViewModel看起来像这样

public class CreateEventViewModel 
{ 
    [Required] 
    [Display(Name = "Name")] 
    public string Name { get; set; } 

    public CreateAccountViewModel CreateAccountViewModel; 
} 

并在视图我可以使用

@Html.EditorFor(model => model.name) 
@Html.EditorFor(model => model.CreateAccountViewModel.Email) 

一切都是伟大的,到目前为止,但我怎么绑定值为CreateAccountViewModel.Email

的结合CreateEventViewModel.Name与此设置

public ActionResult Create([Bind(Include = "Name")] CreateEventViewModel eventViewModel){ 
    ... 
} 

的伟大工程,但我怎么写来获得对CreateEventViewModel.CreateAccountViewModel.Email的结合?

+0

您需要删除'BindAttribute' - 其指定你只绑定了'Name'财产,并排除所有其他属性。而且,由于您使用视图模型,因此不应使用“BindAttribute” - 这是使用视图模型的好处之一。 –

+0

还要注意,'CreateAccountViewModel'是你模型中的一个字段,而不是一个属性,所以它永远不会被正确绑定(添加'{get; set;}') –

回答

1

我想你应该提到被置

public virtual CreateAccountViewModel CreateAccountView {get; set;} 

现在电子邮件中CreateAccountViewModel属性应该是你的创造方法

public ActionResult Create(CreateEventViewModel eventViewModel){ 
    var email = eventViewModel.CreateAccountView.Email; 
} 

内部触及当我们通过模型对象作为参数ASP.net MVC自动为你建模, ASP.NET MVC对来自HTTP世界的所有数据进行模型化,并使用DefaultModelBinder类,它可以神奇地完成所有类型的转换和映射将这些值赋给模型属性。

在创建操作中,我们已经在使用模型绑定。但要进行绑定工作,您的html输入标签属性标识和名称应与模型属性相同。 例如:<input class="textbox" id="Name" name="Name" type"text">CreateAccountViewModelCreateEventViewModel在输入标签不使用ModelObject.PropertyName如下

<input class="textbox" id="CreateAccountView.Email" name="CreateAccountView.Email" type"text"> 
+0

这是可行的,是的。但如何使用绑定解决它? –

+0

你已经使用绑定,因为你传递CreateEventViewModel对象作为参数 – rishi

+0

但让我们说CreateAccountView有名称,我不会允许在此操作中设置赌注。将它绑定到只有CreateAccountView.Email不会允许在操作中设置CreateAccountView.Name? –