簡體   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