从具有根据条件而变化的PartialView的表单收集数据的合适方法是什么

时间:2018-11-09 09:59:11

标签: c# asp.net-mvc entity-framework asp.net-mvc-5 entity-framework-6

我有一个ParentView,它自己的字段很少。此ParentView根据在ParentView中选择的下拉菜单,在3个不同的PartialViews中呈现单个PartialView。因此有PartialViewAPartialViewBPartialViewC。一次只能渲染一个。每个都有自己的表,即。模型类。

Eg: PartialViewAModel:ParentViewModel ..依此类推。

我想到的收集数据的方法之一是使用FormCollection。 因此,如果dropdownvalue为A,我将知道必须选择哪些密钥以及将其存储在何处。

但是有没有更优雅的方法来绑定数据?如果只有一个视图和模型,我本可以在绑定中简单地使用Modelclass。例如:ublic

  [HttpPost]
ActionResult Create(CustomerClass cust)

1 个答案:

答案 0 :(得分:1)

如果您指定具有子部分视图模型的父视图模型,如下所示:

public class ParentViewModel
{
    public ParentViewModel()
    {
        PartialViewModel1 = new PartialViewModel1();
        PartialViewModel2 = new PartialViewModel2();
        PartialViewModel3 = new PartialViewModel3();
    }

    public string PartialViewType { get; set; } /* Value to determine which view to show */

    public PartialViewModel1 PartialViewModel1 { get; set; }
    public PartialViewModel2 PartialViewModel2 { get; set; }
    public PartialViewModel3 PartialViewModel3 { get; set; }
}

部分视图模型(例如PartialViewModel1)具有该视图模型唯一的属性,例如:

public class PartialViewModel1
{
    public string Property1_1 { get; set; }
    public string Property1_2 { get; set; }
    public string Property1_3 { get; set; }
}

您可以指定父视图,使其具有包含部分视图的形式,可以在客户端使用一些JavaScript进行切换(我没有提供,但应该足够简单:)):

@model Models.ParentViewModel
@using (Html.BeginForm("Update", "Home", FormMethod.Post))
{
    @Html.TextBoxFor(x => x.PartialViewType) /* Change this to a drop down */

    @Html.Partial("PartialView1")
    @Html.Partial("PartialView2")
    @Html.Partial("PartialView3")

    <input type="submit" value="Submit" />
}

部分视图如下所示,例如为PartialView1

@model Models.ParentViewModel
<h3>Partial View 1</h3>
<p>@Html.TextBoxFor(x => x.PartialViewModel1.Property1_1)</p>
<p>@Html.TextBoxFor(x => x.PartialViewModel1.Property1_2)</p>
<p>@Html.TextBoxFor(x => x.PartialViewModel1.Property1_3)</p>

因此,现在您可以通过Update来对控制器执行ParentViewModel操作:

[HttpPost]
public ActionResult Update(ParentViewModel model)
{
    // Do whatever processing required.
    // You can switch on model.PartialViewType to process the appropriate PartialView fields

    return View("Index", model);
}

提交时,模型应包含在适当的Partial View Model属性中提交的所有内容。

希望这会有所帮助!