0

Dictionary 引数を持つコントローラー アクションがあります。

[HttpPost]
[AllowCrossSiteJson]
public ActionResult MyActionMethod(Dictionary<string, string> EnteredValues)

JSON を使用してこのメ​​ソッドを呼び出そうとすると、@ 記号が含まれる辞書エントリがリストから削除されます。たとえば、この JSON を使用してメソッドを呼び出すと、次のようになります。

{
    "EnteredValues": {
        "__EVENTTARGET": "",
        "__EVENTARGUMENT": "",
        "__LASTFOCUS": "",
        "ctl00$txtContractQuickSearch": "Contract Search",
        "ctl00$txtAdvisorQuickSearch": "Rep Search",
        "New Business.@StartDate": "1/1/2013",
        "New Business.@EndDate": "10/25/2013",
        "New Business.@RegionCode": "All",
        "ShowChart": "on",
        "txtSearchContractNumber": "Contract Number",
        "txtSearchContractFirstName": "Owner First Name",
        "txtSearchContractLastName": "Owner Last Name",
        "DXScript": "1_42"
    }
}

3 つの「新しいビジネス」エントリは、@ 記号が含まれているため削除されます。なぜこれが起こっているのですか?どうすれば修正できますか?

4

2 に答える 2

0

モデル バインダー動的 JSON オブジェクトを調べた後、独自の Dictionary モデル バインダーを作成することで、この問題を回避することができました。

public class DictionaryStringModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        Dictionary<string, string> model = new Dictionary<string, string>();
        string contentType = controllerContext.RequestContext.HttpContext.Request.ContentType;

        if (contentType != null && contentType.Contains("application/json"))
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            controllerContext.RequestContext.HttpContext.Request.InputStream.Position = 0;
            string content = new StreamReader(controllerContext.RequestContext.HttpContext.Request.InputStream).ReadToEnd();
            var dynamicContent = Json.Decode(content);
            foreach (string property in dynamicContent.GetDynamicMemberNames())
            {
                if (property == bindingContext.ModelName)
                {
                    foreach (string dictionaryProperty in dynamicContent[property].GetDynamicMemberNames())
                    {
                        model.Add(dictionaryProperty, dynamicContent[property][dictionaryProperty]);
                    }
                    break;
                }
            }
        }
        else
        {
            model = (Dictionary<string, string>)ModelBinders.Binders.DefaultBinder.BindModel(controllerContext, bindingContext);
        }

        return model;
    }
}

次に、Globals.asax:Application_Start 内で、このモデル バインダーを次のようにバインドします。

ModelBinders.Binders[typeof(Dictionary<string, string>)] = new DictionaryStringModelBinder();

キーに @ が含まれていても、私の辞書は逆シリアル化されるプロパティになりました。これは、辞書がアクション引数のルート (つまり、アクション引数内のクラス内ではない) と JSON の両方にある場合にのみ機能することに注意してください。

于 2013-10-25T16:42:52.637 に答える