不是所有的MVC形式的值被张贴
本文关键字:张贴 MVC | 更新日期: 2023-09-27 18:18:31
如果可以的话,可以给我一点帮助或建议吗?我有一个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);
}
}
}
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个品牌,它似乎只有12个才能到达'HandleDealerMemberPreferencesAccountUpdate'。
感谢任何帮助(我希望这是一些简单的东西,我已经滑倒了)..
马克好吧,这原来是我的数据的问题,这应该是不可能的。
Stephen Muecke的评论确实是正确的
在for循环中有一个if块。如果它的计算结果为false,这意味着你跳过了一个'indexer',绑定将在你提交时失败。默认情况下,集合索引必须从零开始,并且是连续的。虽然您可以为索引器添加输入以使其工作,但您应该使用仅包含视图中所需对象的视图模型。
从本质上讲,我的一个品牌没有与之相关的部门,因此它没有正确地发布到控制器,从而破坏了解决方案。代码确实需要重构,因此这是不可能的,尽管我已经在CMS中进行了更改,以防止这种情况再次发生。
希望这将帮助其他人,感谢所有的指针。