并非所有MVC表单中的值都被发布

时间:2016-11-17 16:37:28

标签: c# asp.net-mvc asp.net-mvc-4 umbraco surface-controller

如果有人可以提供一些帮助或建议吗? 我有一个MVC表格(它实际上是一个Umbraco表格/表面控制器,但我不知道这与此有任何关系),其模型包含用于生成检查的对象列表-boxes使用HTML帮助方法;请参阅以下帖子,了解我如何渲染这些内容并在我的子操作中接收它们:https://stackoverflow.com/a/20687405/1285676

所有似乎都运行良好,但是虽然所有复选框都在提交时发布,但并非所有复选框都由我的控制器中的ActionResult方法接收的模型拾取。我已经使用chrome中的网络工具查看了发布的数据,所有内容似乎都没问题。(所有复选框似乎都以相同的格式发回),所以百万美元的问题是,可能会阻止什么在模型中拾取一些值?

这是我的表单的一个snipet渲染复选框,因为其余部分不应该相关(是的,真实的东西中有一个提交按钮......):

@model MemberPreferencesVM
@using (Html.BeginUmbracoForm<MemberAccountSurfaceController>("HandleDealerMemberPreferencesAccountUpdate", FormMethod.Post, new { @class = "", @id = "dealer-member-account-preferences-form" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    @for (var j = 0; j < Model.Brands.Count; j++)
    {
        if (Model.Brands[j].Division == Model.Divisions[i].Id.ToString())
        {
            var divisionSelected = Model.Divisions.Any(x => x.Id.ToString() == Model.Brands[j].Division) ? Model.Divisions.FirstOrDefault(x => x.Id.ToString() == Model.Brands[j].Division).Checked : false;
            var checkboxAttr = new Dictionary<string, object> { { "class", "styled" }, { "data-division", Model.Brands[j].Division } };
            var brandSelected = Model.Brands[j].Checked;

            <div class="col-xs-4">
                <label class="option @if (divisionSelected && brandSelected){<text>active</text>}">
                    <img src="@(Model.Brands[j].LogoUrl)" class="center-block" alt="@(Model.Brands[j].Name)" />
                    <span class="checkbox">
                        @Html.HiddenFor(model => model.Brands[j].Id)
                        @Html.HiddenFor(model => model.Brands[j].Name)
                        @Html.CheckBoxFor(model => model.Brands[j].Checked, checkboxAttr)
                    </span>
                </label>
            </div>
        }
    }
}

轻微缩减版本的模型:

public class MemberPreferencesVM: IValidatableObject
{
    public MemberPreferencesVM()
    {
        init();
    }
    private void init()
    {
        Divisions = [Logic to fetch divisions];
        Brands = [Logic to fetch brands];
    }
    public IList<DivisionVM> Divisions { get; set; }
    public IList<BrandVM> Brands { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var pDivisions = new[] { "Divisions" };
        var pBrands = new[] { "Brands" };
        if (!Divisions.Any(x => x.Checked))
        {
            yield return new ValidationResult("Select at least 1 division to view by default", pDivisions);
        }
        if (!Brands.Any(x => x.Checked))
        {
            yield return new ValidationResult("Select at least 1 brand to view by default", pBrands);
        }
    }
}

BrandVM:

public class BrandVM
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string LogoUrl { get; set; }
    public bool Checked { get; set; }
    public string Division { get; set; }
}

ActionResult:

[ValidateAntiForgeryToken]
[ValidateInput(true)]
[HttpPost]
public ActionResult HandleDealerMemberPreferencesAccountUpdate(MemberPreferencesVM model)
{
    //logic removed as model doesn't arrive will all values so not relevant 
    return CurrentUmbracoPage();
}

该模型应该包含24个品牌,它似乎只是到达了HandleDealerMemberPreferencesAccountUpdate&#39;用12。

任何帮助表示感谢(我希望它在我滑倒的地方变得简单)..

标记

1 个答案:

答案 0 :(得分:0)

好的,这对我的数据来说是一个问题,这是不可能的。

Stephen Muecke上面的评论确实是正确的

  

你的for循环中有一个if块。如果评估为false,则意味着您跳过“索引器”,并且在提交时绑定将失败。默认情况下,集合索引器必须从零开始并且是连续的。虽然您可以为索引器添加输入以使其工作,但您应该使用仅包含视图中所需对象的视图模型。

基本上,我的一个品牌没有与之相关的部门,因此它没有正确地发布到控制器而破坏了解决方案。代码确实需要重构,所以这是不可能的,尽管我已在CMS中进行了更改以防止再次发生这种情况。

希望这会对其他人有所帮助,感谢大家指点。