2016-09-20 79 views
2

我嘗試爲我的所有網格視圖控制器製作一些抽象類。由於所有控制器都具有相同的GridViewPartial Action但具有不同的參數,因此我決定使用Args屬性創建結構ActionParams以保留所有輸入參數。 因此,這裏是我的結構:Devexpress MVC對象作爲回調參數

public struct ActionParams 
     { 
      public Dictionary<string, object> Args { get; set; } 

     } 

和控制器的動作

public ActionResult GridViewPartial(ActionParams input) { } 

的問題是在JS onBeginCallback功能。我試圖以兩種方式執行此任務:

1)

function onBeginCallback(s, e) 
{ 
        e.customArgs["Args"]={"value1":1,"value2":2}; 
} 

非但沒有串鍵和int值的,我得到了字符串鍵和字符串[]值。據我瞭解這是序列化問題。

2)

function onBeginCallback(s, e) 
    { 
     var editorsNames = {"value1":1),"value2":2} 
     e.customArgs["Args"] = $.toJSON(editorsNames); 
    } 

這樣我得到空的參數數量。但對象是Request.Params所以我在下面的方式獲得:

public ActionResult GridViewPartial(ActionParams input) 
     { 

      string jsonText = Request.Params["Args"]; 
      if (string.IsNullOrEmpty(jsonText)) 
      { } 
      else 
      { 
       ActionParams data = new ActionParams>(); 
       try 
       { 
        data.Args = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Dictionary<string,int>>(jsonText); 
       } 
       catch 
       { 
        ViewData["ErrorMessage"] = "Incorrect data"; 
       } 
      } 

     } 

現在,我不知道是否可以直接發送此JSON對象input.Args就像是在情況1?(簡單的jquery ajax一切正常)。

希望有一個偉大的devexpress MVC控件表達式的人會給我一些很好的建議。

回答

1

根據How to pass complex types to the server with a callback customArgs argument

當你創建一個對象,並把它傳遞給e.customArgs說法, 我們的代碼沒有對象序列化到一個字符串,這樣的話你就 得不到客戶端對象在服務器端正確。

的第一次努力以揭示使用console.log(e.customArgs)生JSON對象如何傳遞給控制器​​顯示在控制檯此對象結構:

Object { Args: Object {"value1": 1, "value2": 2}} 

當輸入Args參數指定爲Dictionary<String, int>,看來我還是能夠捕捉到

public ActionResult GridViewPartial(Dictionary<String, int> Args) 
{ 
    // Args parameter contains 2 arrays with Count = 2 
    // Args.Keys contains "value1" and "value2" 
    // Args.Values contains 1 and 2 
    foreach (String key in Args.Keys) 
    { 
     // do something to pass keys 
    } 

    foreach (int value in Args.Values) 
    { 
     // do something to pass values 
    } 
} 

結果::

由此代碼鍵和值在JSON對象
Variable: Args 
Count: 2 
Content: 
0x0000 {["value1", 1]} 
0x0001 {["value2", 2]} 

然而,當我改變了價值部分Dictionary<String, Object>,我發現同樣的事情你的問題:Value部分改爲System.String[]數組,它包含數字1或2的字符串。

Variable: Args 
Count: 2 
Content: 
0x0000 {["value1", System.String[]]} => Value: String[1] => 0x0000 = "1" 
0x0001 {["value2", System.String[]]} => Value: String[1] => 0x0000 = "2" 

試圖改變輸入變量的類型到Dictionary<String, String>返回此:

Variable: Args 
Count: 2 
Content: 
0x0000 {["value1", "1"]} 
0x0001 {["value2", "2"]} 

第二種情況使用jQuery JSON plugin其將通過editorsNames給予JSON格式的字符串對象,然後傳遞到響應爲純可由控制器端的解串器識別的字符串。這種方法滿足客戶端的對象應該如何被傳遞到:

  1. 自定義對象應序列爲字符串;
  2. 將使用Request.Params集合在服務器端獲取此字符串。如果你反序列化字符串,你將會是 能夠在服務器端創建你的自定義對象。

因此,我的結論是,可以通過2種方式傳遞原始JSON對象:

  1. 通過直接使用customArgs,可以聲明一個Dictionary作爲輸入參數並且使用數值類型傳遞值或String。避免使用似乎創建字符串數組作爲值部分的Object類型。

  2. 通過使用Request.Params,將JSON對象轉換爲編碼字符串並將其傳遞到customArgs,然後使用反序列化來揭示鍵和值。

NB:代替使用一個結構的包含字典作爲單一輸入參數,可以寫幾個GridViewPartial與不同量的輸入參數來處理網格局部視圖方法重載。

任何建議或erratas歡迎。

附加參考:

How to pass complex objects to a callback Action as callback arguments

+0

我沒有嘗試在所有)閱讀你的答案後,我決定做<字符串,字符串>,讓我送,我想要的任何數據和上將其轉換成我需要的數據。 現在我在字典中獲取我的json,其中key = objname amd value = serialized string) – DespeiL

+0

Thx,爲您的詳細問題分析和建議 – DespeiL