我正在尝试将名称列表发布到表单,允许用户选择相关名称,然后将其重新发布。一切正常,但发回为空。你能指出我的愚蠢错误吗?
[HttpGet]
public IActionResult Start()
{
// Get guid and name for all chars and post as list with PC/NPC role and selector.
// Post this list to the view.
List<CombatantSelect>cs_list = new List<CombatantSelect>();
var chars = _context.Characters.AsEnumerable();
foreach(var c in chars)
{
CombatantSelect cs = new CombatantSelect();
cs.CharGuid = c.Id.ToString();
cs.Name = c.Name;
cs.Role = c.PlayerRole.ToString();
cs_list.Add(cs);
}
return View(cs_list);
}
这是发布此列表的控制器动作见图。当它到达时,我现在正确地形成了它。
我使用此视图渲染表格。
@using Traveller_Web_2.ViewModels
@model List<CombatantSelect>
@{
ViewData["Title"] = "Start";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h1>Start</h1>
<h6>tbc</h6>
<hr />
<div class="row">
<div class="col-md-4">
<form method="post" asp-action="Start" asp-controller="Combat">
<table class="table">
<thead class="">
<tr>
<th>Select for combat</th>
<th>Name</th>
<th>Role</th>
</tr>
</thead>
<tbody>
@Html.EditorForModel("CombatantSelect")
</tbody>
</table>
<input asp-action="Start" asp-controller="Combat" type="submit" value="Select" class="btn btn-primary" />
</form>
</div>
</div>
这是视图模型:
public class CombatantSelect
{
[Key]
public string CharGuid { get; set; }
public string Name { get; set; }
public string Role { get; set; }
public bool SelectForCombat { get; set; }
}
这个编辑器模板:
@model IEnumerable<Traveller_Web_2.ViewModels.CombatantSelect>
@for (int i = 0; i < Model.Count(); i++)
{
<tr>
<td>
<input id="SelectForCombat[@i]" asp-for="@Model.ElementAt(i).SelectForCombat" type="checkbox" name="SelectForCombat[@i]" itemid="@i" />
</td>
<td>
<input id="Name[@i]" name="Name[@i]" asp-for="@Model.ElementAt(i).Name" type="text" />
</td>
<td>
<input id="Name[@i]" name="Name[@i]" asp-for="@Model.ElementAt(i).Role" type="text" />
<input id="CharGuid[@i]" name="CharGuid[@i]" type="hidden" asp-for="@Model.ElementAt(i).CharGuid" />
</td>
</tr>
}
这是演示ID和Name中索引的一部分。
<form method="post" action="/Combat/Start">
<table class="table">
<thead class="">
<tr>
<th>Select for combat</th>
<th>Name</th>
<th>Role</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<input id="SelectForCombat[0]" type="checkbox" name="SelectForCombat[0]" itemid="0" data-val="true" data-val-required="The SelectForCombat field is required." value="true" />
</td>
<td>
<input id="Name[0]" name="Name[0]" type="text" value="Chief Sales Officer" />
</td>
<td>
<input id="Name[0]" name="Name[0]" type="text" value="Player" />
<input id="CharGuid[0]" name="CharGuid[0]" type="hidden" value="bf373774-691a-43f2-5ff8-08d75cab14e2" />
</td>
</tr>
<tr>
<td>
<input id="SelectForCombat[1]" type="checkbox" name="SelectForCombat[1]" itemid="1" value="true" />
</td>
<td>
<input id="Name[1]" name="Name[1]" type="text" value="Deputy Shop Assistant" />
</td>
<td>
<input id="Name[1]" name="Name[1]" type="text" value="FriendlyNPC" />
<input id="CharGuid[1]" name="CharGuid[1]" type="hidden" value="347298c5-984b-460a-f9f8-08d75cac89b9" />
</td>
</tr>
它回传到控制器中的该方法。
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Start([Bind("CharGuid, Role, SelectForCombat, Name")]
List<CombatantSelect> combatantSelects)
{
// If it works do something with it, if not give it back
if (ModelState.IsValid)
{
combatantSelects.Count();
}
return View(combatantSelects);
}
在ModelState
没有错误-它告诉我有一个名单CombatantSelect
,但它具有计数0。
有任何想法吗?提前谢谢了。
MVC根据过帐值重新创建模型。它检查特定的名称以再次创建模型。因此HTML中的名称应与模型中的名称对齐。尝试下面的代码来解决模型绑定问题
将类型的模型传递List<Traveller_Web_2.ViewModels.CombatantSelect>
给视图
如下修改代码,以使生成的HTML输入控件名称与模型对齐
@model List<Traveller_Web_2.ViewModels.CombatantSelect>
@for (int i = 0; i < Model.Count; i++)
{
<tr>
<td>
@Html.CheckBoxFor(x => x[i].SelectForCombat)
</td>
<td>
@Html.TextBoxFor(x => x[i].Name)
</td>
<td>
@Html.TextBoxFor(x => x[i].Role)
@Html.HiddenFor(x => x[i].CharGuid)
</td>
</tr>
}
上面的代码应创建一个名称,其名称与模型对齐。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句