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