繁体   English   中英

如何为ASP.NET Core中的Controller Action覆盖默认反序列化?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM