簡體   English   中英

如何接受隨機對象作為控制器的動態參數

[英]How can I accept a random object as a dynamic parameter to my controller

我不太確定如何問這個問題。 實際上,我以前曾做過這項工作,然后進行了一些看似微不足道的更改並破壞了它,但我不確定如何使它生效。

我想做的是在控制器操作中有一個動態對象參數,以便在向其發布一些序列化表單數據時,動態對象將自動綁定到發送給它的各種屬性。

我環顧了很多問題,但大多數問題都已過時,並指出需要自定義模型綁定程序,但我想重申一下,如果沒有自定義模型綁定程序,這是可行的。 我只是在發布數據中包含formData,並使用動態formData參數捕獲了它。

那么在什么條件下ASP.NET會假定這就是我想要的?

public void Post(JObject dynamicJSON)
{
  dynamic myObj = dynamicJSON;
  int id = myObj.Id
}

JObject類是Newtonsoft.JSON庫的一部分

我有一天在偷看,我看到那個威脅。

控制者

[HttpPost]
public ActionResult DoSomething(string a, string b, dynamic c)
{
    return new EmptyResult();
}

然后做動態模型binder接口聲明

public class DynamicJsonAttribute : CustomModelBinderAttribute
{
    public override IModelBinder GetBinder()
    {
        return new DynamicJsonBinder(MatchName);
    }

    public bool MatchName { get; set; }
}

這是實現

using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Web.Helpers;
using System.Web.Mvc;

public class DynamicJsonBinder : IModelBinder
{
    private readonly bool matchName;

    public DynamicJsonBinder(bool matchName)
    {
        this.matchName = matchName;
    }

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var contentType = controllerContext.HttpContext.Request.ContentType;
        if (!contentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
            return null;

        string bodyText;
        using (var stream = controllerContext.HttpContext.Request.InputStream)
        {
            stream.Seek(0, SeekOrigin.Begin);
            using (var reader = new StreamReader(stream))
                bodyText = reader.ReadToEnd();
        }

        if (string.IsNullOrEmpty(bodyText)) return null;

        var desiralized = Json.Decode(bodyText);

        if (!matchName) return desiralized;

        var members = desiralized.GetDynamicMemberNames() as IEnumerable<string>;
        return members == null
            || members.Contains(bindingContext.ModelName)
            ? desiralized[bindingContext.ModelName] : null;
    }
}

你被黑了---快樂的編碼

反正我是讀這個URL線程--- 看出來

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM