【发布时间】:2025-11-30 13:00:02
【问题描述】:
我正在使用 asp.net core 2.2 并尝试实现POST-REDIRECT-GET using TempData in ASP.NET Core 中概述的模式。我有两个动作如下:
[ImportModelState]
public async Task<IActionResult> Upload(int id, CancellationToken ct)
{
var model = new MyModel();
// ...
return this.View(model);
}
[HttpPost]
[ExportModelState]
public async Task<IActionResult> Upload(int id, MyModel model, CancellationToken ct)
{
// ...
}
在访问get 视图,输入表单详细信息并提交后,我在post 操作中设置了一个断点,以查看MyModel 参数的绑定模型数据,我看到一个布尔值@ 的数组987654328@ 字段支持视图表单中的复选框: 但是 Replace 字段有效,如果模型状态有效,则表单复选框状态的一切都会成功。
如果表单无效并且我将模型状态序列化为 tempdata 并将其合并到重定向到 get 操作,我会收到异常 System.InvalidOperationException: The parameter conversion from type 'Newtonsoft.Json.Linq.JArray' to type 'System.Boolean' failed because no type converter can convert between these types.
为什么模型绑定器为布尔字段创建一个数组(这是由于表单和复选框的语义吗?)它适用于 post 操作,但相同的数据无法绑定到相同的模型类型何时重新填充视图?
临时数据的序列化使用以下逻辑:
var errorList = modelState
.Select(kvp => new ModelStateTransferValue
{
Key = kvp.Key,
AttemptedValue = kvp.Value.AttemptedValue,
RawValue = kvp.Value.RawValue,
ErrorMessages = kvp.Value.Errors
.Select(p => p.ErrorMessage)
.ToList(),
});
反序列化和合并使用如下逻辑:
var errorList = JsonConvert.DeserializeObject<List<ModelStateTransferValue>>(serialized);
var modelState = new ModelStateDictionary();
foreach (var item in errorList)
{
modelState.SetModelValue(item.Key, item.RawValue, item.AttemptedValue);
foreach (var error in item.ErrorMessages)
{
modelState.AddModelError(item.Key, error);
}
}
filterContext.ModelState.Merge(modelState);
【问题讨论】:
-
您能告诉我们您是如何将
ModelState的序列化编码为TempData的吗? -
没问题,我已经更新了问题。
标签: c# asp.net-core