MVC表单无法发布对象列表

MVC表单无法发布对象列表

所以我有一个MVC ASP.NET应用程序有问题。本质上,我有一个视图,它包含一个表单,它的内容被绑定到一个对象列表中。在这个循环中,它加载PartialView中正在循环的项。现在一切都在运转,直到形体被提交。当提交时,控制器将被发送一个空对象列表。下面的代码证明了这些问题。

家长意见:

@model IEnumerable<PlanCompareViewModel>@using (Html.BeginForm("ComparePlans", "Plans", FormMethod.Post, new { id = "compareForm" })){<div>
    @foreach (var planVM in Model)
    {
        @Html.Partial("_partialView", planVM)
    }</div>}

_ParalView:

@model PlanCompareViewModel<div>
    @Html.HiddenFor(p => p.PlanID)
    @Html.HiddenFor(p => p.CurrentPlan)
    @Html.CheckBoxFor(p => p.ShouldCompare)
   <input type="submit" value="Compare"/></div>

以下是上述代码的类:

PlanViewModel:

public class PlansCompareViewModel{

    public int PlanID { get; set; }
    public Plan CurrentPlan { get; set; }
    public bool ShouldCompare { get; set; }
    public PlansCompareViewModel(Plan plan)
    {
        ShouldCompare = false;
        PlanID = plan.PlanId;
        CurrentPlan = plan;
    }

    public PlansCompareViewModel()
    {
        // TODO: Complete member initialization
    }
    public static IEnumerable<PlansCompareViewModel> CreatePlansVM(IEnumerable<Plan> plans)
    {
        return plans.Select(p => new PlansCompareViewModel(p)).AsEnumerable();
    }}

主计长:

public class PlansController : MyBaseController{
    [HttpPost]
    public ActionResult ComparePlans(IEnumerable<PlanCompareViewModel> model)
    {
         //the model passed into here is NULL
    }}

问题在于控制器的作用。据我所知,它应该发布一个PlanCompareViewModel的可枚举列表,但它是空的。在检查发送的POST数据时,它发送的是正确的Params。如果我要将‘IEnDigable’改为‘FormCollection’,它包含正确的值。有人知道为什么绑定器没有创建正确的对象吗?我可以使用javascript绕过这个问题,但这违背了目的!任何帮助都将不胜感激!


慕仙森
浏览 446回答 2
2回答

largeQ

你的模型是null因为向表单提供输入的方式意味着模型绑定器无法区分元素。现在,这个代码:@foreach&nbsp;(var&nbsp;planVM&nbsp;in&nbsp;Model){ &nbsp;&nbsp;&nbsp;&nbsp;@Html.Partial("_partialView",&nbsp;planVM)}没有为这些项目提供任何类型的索引。因此,它将反复生成HTML输出,如下所示:<input&nbsp;type="hidden"&nbsp;name="yourmodelprefix.PlanID"&nbsp;/><input&nbsp;type="hidden"&nbsp;name="yourmodelprefix.CurrentPlan"&nbsp;/><input&nbsp;type="checkbox"&nbsp;name="yourmodelprefix.ShouldCompare"&nbsp;/>但是,由于您希望绑定到集合,因此需要用索引命名表单元素,如:<input&nbsp;type="hidden"&nbsp;name="yourmodelprefix[0].PlanID"&nbsp;/><input&nbsp;type="hidden"&nbsp;name="yourmodelprefix[0].CurrentPlan"&nbsp;/><input&nbsp;type="checkbox"&nbsp;name="yourmodelprefix[0].ShouldCompare"&nbsp;/><input&nbsp;type="hidden"&nbsp;name="yourmodelprefix[1].PlanID"&nbsp;/><input&nbsp;type="hidden"&nbsp;name="yourmodelprefix[1].CurrentPlan"&nbsp;/><input&nbsp;type="checkbox"&nbsp;name="yourmodelprefix[1].ShouldCompare"&nbsp;/>该索引使模型绑定器能够关联独立的数据段,从而使其能够构造正确的模型。所以我建议你做些什么来解决这个问题。与其使用部分视图遍历集合,不如利用模板的强大功能。以下是您需要遵循的步骤:创建一个EditorTemplates视图当前文件夹中的文件夹(例如,如果您的视图是Home\Index.cshtml,创建文件夹Home\EditorTemplates).在该目录中创建一个强类型视图,其名称与您的模型相匹配。在你的情况下PlanCompareViewModel.cshtml.现在,您的部分视图中的所有内容都希望进入该模板:@model&nbsp;PlanCompareViewModel<div> &nbsp;&nbsp;&nbsp;&nbsp;@Html.HiddenFor(p&nbsp;=>&nbsp;p.PlanID) &nbsp;&nbsp;&nbsp;&nbsp;@Html.HiddenFor(p&nbsp;=>&nbsp;p.CurrentPlan) &nbsp;&nbsp;&nbsp;&nbsp;@Html.CheckBoxFor(p&nbsp;=>&nbsp;p.ShouldCompare) &nbsp;&nbsp;&nbsp;<input&nbsp;type="submit"&nbsp;value="Compare"/></div>最后,将父视图简化为:@model&nbsp;IEnumerable<PlanCompareViewModel>@using&nbsp;(Html.BeginForm("ComparePlans",&nbsp;"Plans",&nbsp;FormMethod.Post,&nbsp;new&nbsp;{&nbsp;id&nbsp;=&nbsp;"compareForm"&nbsp;})){<div> &nbsp;&nbsp;&nbsp;&nbsp;@Html.EditorForModel()</div>}DisplayTemplates和EditorTemplates足够聪明,可以知道他们何时处理集合。这意味着它们将自动为表单元素生成正确的名称,包括索引,以便正确建模绑定到集合。
打开App,查看更多内容
随时随地看视频慕课网APP