c# - 如何覆盖 ASP.NET Core 中控制器操作的默认反序列化?
问题描述
我在控制器中有一个动作,它有一个类型的参数Class1
[HttpPost]
public IActionResult Create(Class1 c)
{
}
我使用 JQuery 的 Ajax 函数向它发送数据。
我想编写自己的代码来反序列化SampleProperty
:
class Class1
{
public string SampleProperty { get; set; }
}
可能吗?我想覆盖默认反序列化。
我尝试了很多东西,例如编写转换器:
public class SamplePropertyConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(string);
}
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
if ((string)existingValue == "abc")
return "abc123";
else
return existingValue;
}
public override void WriteJson(JsonWriter writer, object value,
JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanWrite => false;
public override bool CanRead => true;
}
然后像这样使用它:
class Class1
{
[JsonConverter(typeof(SamplePropertyConverter))]
public string SampleProperty { get; set; }
}
但在这种情况下SamplePropertyConverter
根本不使用。我也尝试在 Startup 中添加它,但后来我看到它进入CanConvert
方法,但仅用于其他一些请求,而不是发送Class1
到Create
Action。
解决方案
如果不使用json
,可以使用自定义模型绑定来制作。
1.假设你有ajax代码:
var data = { "SampleProperty": "abc"};
$(document).ready(function () {
$.ajax({
url: '/Test/Create',
type: 'POST',
data: data,
success: function () {
}
});
});
2.控制器:
[HttpPost]
public IActionResult Create(Class1 c)
{
}
3.Class1.cs:
class Class1
{
[ModelBinder(BinderType = typeof(TestModelBinder))]
public string SampleProperty { get; set; }
}
4.TestModelBinder.cs
public class TestModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
throw new ArgumentNullException(nameof(bindingContext));
var values = bindingContext.ValueProvider.GetValue("SampleProperty");
string result = "";
if (values.FirstValue == "abc")
{
result = "abc123";
}else
{
result = values.FirstValue;
}
bindingContext.Result = ModelBindingResult.Success(result);
return Task.CompletedTask;
}
}
推荐阅读
- excel-addins - Microsoft.Office.Tools.Excel.ListObject.GetVstoObject 方法缺少 excel 列表对象
- c++ - 使数组结构看起来像结构数组的 std::vector 包装器
- java - 如何在 java 中使用 ObjectMapper 从 JSON 中获取单个键值
- r - 在 ggplot2 中格式化 Geom_Bar
- apache-kafka - 未找到主题融合 kafka 模式注册表错误代码“:40401,”消息
- sql - 查找过去的日期,始终基于今天的日期
- docker - 如何在 Dockerfile 中安装 Web 服务增强 (WSE) 3.0
- machine-learning - 流失预测中的特征选择
- php - 通过来自 axios 的补丁请求上传文件时出现问题
- r - r中的格式更改