我有两个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。
希望,问题很清楚。我不知道怎么回答。请帮忙。
答案 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();
}
}
现在你应该从小视图和大视图模型中获取数据。