如何组合viewmodels?

时间:2014-07-17 20:59:21

标签: c# jquery asp.net-mvc asp.net-mvc-4 razor

我有两个Viewmodel,一个视图和两个局部视图以及一个用于提交的控制器方法。 让我们在控制器中命名它们,BigViewModel,SmallViewModel,Page.cshtml,_Options.cshtml,_Submit.cshtml和Submit(BigViewModel)方法。

SmallViewModel作为其中一个属性包含在BigViewModel中。

喜欢,

public class BigViewModel
{
    public bool Confirm { get; set; }
    public SmallViewModel s { get; set; }
}

现在,Page.cshtml有一个_Options.cshtml所在的部门,用户可以输入很多选项,如排序,搜索等。这个_Options.cshtml使用一个名为SmallViewModel的视图模型。当您单击_Options.cshtml局部视图上的“提交”按钮时,它会打开一个_Submit.cshtml对话框,要求提供确认和提交按钮。此确认信息存储在BigViewModel中。现在,当我热提交时,它将转到控制器中的Submit(BigViewModel)方法。

我的问题是如何从_Submit.cshtml局部视图页面将SmallViewModel数据包含到BigViewModel中。因为,当我转到Submit(BigViewModel)方法时,我只看到Confirm - True / False。但是smallViewModel为null。

希望,问题很清楚。我不知道怎么回答。请帮忙。

1 个答案:

答案 0 :(得分:1)

您可以简单地创建一个界面,其中包含带有选项的所有模型。这是一个示例:

   public class BigViewModel : IModelOptions
    {
        public bool Confirm { get; set; }
        public SmallViewModel SmallView { get; set; }
    }

    public class SmallViewModel
    {
        public string Stuff{ get; set; }
    }

    public interface IModelOptions
    {
        SmallViewModel SmallView { get; set; }
    }

这种方式如果您需要更多带有选项的模型,您可以轻松地执行“NewModel:IModelOptions”。现在你的_options视图看起来像

@model MvcApplication1.Models.IModelOptions

@Html.TextAreaFor(x => x.SmallView.Stuff)

请注意,现在您的局部视图不需要知道传入的模型。只要它来自IModelOptions,它就知道它将具有SmallView。我们的_submit就像是

Are you sure? If so I will use fancy javascript to allow you to submit!
<input type="submit"/>

然后我们在主视图中将所有这些组合在一起(索引,页面,你有什么)

@model MvcApplication1.Models.BigViewModel

@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.Confirm)

    {
        Html.RenderPartial("_Options");
        Html.RenderPartial("_Submit");
    }
}

请注意,我们在这里接受BigViewModel。这应该可以正常工作,因为我们的BigViewModel包含选项并从IModelOptions派生。

我们的控制器只是

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(BigViewModel model)
    {
        var smallVIewModelInfo = model.SmallView.Stuff;
        var bigViewModelConfirm = model.Confirm;
        return View();


}
    }

现在你应该从小视图和大视图模型中获取数据。