【问题标题】:Not all values in MVC form being posted并非所有以 MVC 形式发布的值
【发布时间】:2017-04-01 07:33:45
【问题描述】:

如果你们可以提供一点帮助或建议? 我有一个 MVC 表单(它实际上是一个 Umbraco 表单/表面控制器,但我不知道这与此有什么关系),其模型包含一个对象列表,用于使用 HTML 辅助方法生成复选框;请参阅以下帖子,了解我如何呈现这些并在我的子操作中接收它们:https://stackoverflow.com/a/20687405/1285676

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

这是我渲染复选框的表单片段,由于其余部分不相关(是的,真实的东西中有一个提交按钮......):

@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);
        }
    }
}

品牌虚拟机:

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; }
}

动作结果:

[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 个品牌,但似乎只有 12 个品牌才能到达“HandleDealerMemberPreferencesAccountUpdate”。

任何帮助表示赞赏(我希望这是我滑倒的简单事情)..

标记

【问题讨论】:

  • 您必须为不属于表单 UI 的值添加隐藏字段并且要提交它们。
  • 唉,我已经试过了,但没有任何区别...... 24个中有12个被传入。它们是否被检查似乎也无所谓,传入的12个是与各个部门相关的各种品牌的组合。
  • 我认为除了您告诉我们的内容之外,还有其他事情正在发生。是否有任何复选框被 JavaScript 禁用?当然,当您查看发布的数据时,它们不会出现。数据中的 24 个是否都显示在开发工具中?
  • 好的,所以我在发布之前禁用了所有针对复选框的 javascript,并删除了任何可能禁用它们的内容。在提交表单时,我可以看到使用 Chrome 开发工具中的网络选项卡发布了以下内容:pastebin link
  • @krillgar 这也是我的第一个想法。如果没有人能够发现明显的东西,那么我可能不得不从头开始重新开始,因为我确信这是我想念的简单的东西(我不是唯一一个在这方面工作的人,所以我不得不挖掘很多脚本等,看看还有什么可能是错误的,但无济于事)。我只是想确保它与我的 html 和控制器无关..

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


【解决方案1】:

好的,结果证明这是我的数据有问题,这是不可能的。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 2018-05-15
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 2014-09-22
    相关资源
    最近更新 更多