我有一个具有以下定义的函数,第一个是默认值,第二个是
POST
:
public IActionResult TenantTBMapping(int tenantId)
[HttpPost]
public IActionResult TenantTBMapping(TenantTBMappingViewModel model)
模型定义如下:
public class TenantTBMappingViewModel
{
public int TenantId { get; set; }
public List<MappingConfigDetail> Details { get; set; }
public List<string>? ToNames { get; set; }
public List<SelectListItem>? Inputs { get; set; }
public List<SelectListItem>? MappingTables { get; set; }
}
我在页面的表单上有这个标准
HiddenFor
:
@using (Html.BeginForm("TenantTBMapping", "Settings", FormMethod.Post))
{
@Html.HiddenFor(model => model.TenantId);
// ...
}
据我所知,这很正常,看起来就像我已经构建了数百次的相同页面。但由于某种原因,
TenantId
属性无法绑定,并且总是给出0。如果我直接使用从表单中提取值
var test = Request.Form["TenantId"];
它甚至返回正确的值,所以它与模型绑定有关。
我唯一能猜测的是,表单的结构在某种程度上搞乱了
TenantId
绑定。正如您所看到的,该模型包含多个列表字段,但从表单返回的唯一字段是“详细信息”。我详细地编辑了每个条目的每个属性的字段(即 Model.Details[i].MappingConfigId
),并且详细信息及其字段正确绑定。
这是使用 ASP.NET Core 8 MVC。
编辑:我尝试删除表单中的所有内容,除了隐藏字段和正确绑定的值之外,所以它肯定与表单结构有关。在 SO 上发布有点复杂,但我会尽力提供示例。
我有一个组件,它接受名为
EditConfiguration
的类的列表,这就是生成我的可编辑字段的组件。同样,这些字段本身工作正常,它们只是以某种方式干扰了 TenantId
的绑定。如果有帮助的话,我可以发布有关此组件/类的更多详细信息。
@Html.HiddenFor(model => model.TenantId);
<div id="edit-mappings" style="display:none;">
@for (int i = 0; i < Model.Details.Count; i++)
{
MappingConfigDetail detail = Model.Details[i];
string prefix = "Model.Details[" + i.ToString() + "].";
<div class="info-edit list-edit">
<div>
<h2>@Model.ToNames[i]</h2>
</div>
@await Component.InvokeAsync("Edit", new { config = new List<EditConfiguration>() {
new EditConfiguration() {/*params for my EditConfiguration class*/ },
编辑2:负载截图
好吧,我明白了。由于详细信息字段使用
Model.
前缀,因此我还需要对 TenantId 执行相同的操作。我不太明白,但我猜因为 TenantId 本身是单独的,而其他字段专门使用了Model.
,所以它需要统一。 (也许从其他字段中删除“Model.”会产生相同的效果?)