[英]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
(这似乎不是您的选择),也可以更改端点以将其所有相关属性作为简单类型( string
, bool
, int
等)来区别对待。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.