繁体   English   中英

如何将Javascript字典传递给C#字典值是对象的控制器

[英]How to pass Javascript dictionary to controller where C# dictionary value is an object

想象一下这个Javascript字典:

var things = {};
things['1'] = 10;
things['2'] = 11;

这是一些ajax代码:

$.ajax({
    url: '/Controller/Foo',
    type: 'POST',
    data: {
        things: things
    },

这是可行的:

[HttpPost]
public IActionResult Foo(Dictionary<string, int> things)

事情将显示1映射到10和2映射到11。

这是行不通的:

[HttpPost]
public IActionResult Foo(Dictionary<string, object> things)

事物将显示1映射为null和2映射为null。

我无法更改字典类型。 实际上,该Dictionary是整个应用程序中使用的复杂对象的一部分(在C#方面)。 您正在查看的是一个愚蠢的示例。

另外,JSON.stringify完全没有帮助。 实际上,如果我对字典进行字符串化处理,则我得到的计数为0,没有值。

使用C#来表达我的观点,我认为期望比当前要高得多:

int x = 5;
object foo = (object)x;

字典的定义是这样的,因为可以这样做:

things[key] = 1;

要么

things[key] = "string";

这就是为什么它被声明为对象。

如果重要的话,我正在使用ASP.NET Core(和jquery 3.4.1)。

谢谢。

您可以自定义一个DictionaryModelBinder如下所示:

 public class DictionaryModelBinder:IModelBinder
{
    public  Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
            throw new ArgumentNullException(nameof(bindingContext));

        var result = new Dictionary<string, object> {};
        var form = bindingContext.HttpContext.Request.Form;
        if (form==null)
        {
            bindingContext.ModelState.AddModelError("FormData", "The data is null");
            return Task.CompletedTask;
        }
        foreach ( var k in form.Keys){
            StringValues v = string.Empty;
            var flag = form.TryGetValue(k, out v);
            if (flag)
            { 
                result.Add(k, v );
            }
        }

        bindingContext.Result = ModelBindingResult.Success(result);
        return Task.CompletedTask;
    }
}

控制器:

[HttpPost]
    public IActionResult Foo([ModelBinder(BinderType = typeof(DictionaryModelBinder))]Dictionary<string, object> things)
    {
        // the stuff you want
    }

我不认为您可以将object绑定为参数(或Dictionary值类型),因为:

复杂类型必须具有公共默认构造函数和公共可写属性才能绑定。 发生模型绑定时,将使用公共默认构造函数实例化该类。

我认为您可以强烈地键入object (这似乎不是您的选择),也可以更改端点以将其所有相关属性作为简单类型( stringboolint等)来区别对待。

参考: ASP.NET Core中的模型绑定

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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