![](/img/trans.png)
[英]How to change the default controller and action in ASP.NET Core API?
[英]How to override default deserialization for Controller Action in ASP.NET Core?
我在Controller中有一个Action,它的参数类型为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.Controller:
[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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.