2014-01-21 102 views
0

我有一個文本框和一個選擇選項多個,我存儲了所有使用視圖模型中的knockout selectedOptions選擇的項目。通過Ajax將Var和列表傳遞給控制器​​

如果我嘗試使用ajax將捕獲的信息傳遞給我的控制器,我無法接收我的MetricsChosenModel。

  var MetricsChosenModel= window.vm.MetricsChosenModel(); 
      var ApplicationsNameValue = $.trim($("#add-Applications").val()); 
      if (ApplicationsNameValue.length <= 0) { 
       $("#text-add-Applications").popover('show'); 
      } 
       $.ajax({ 
        url: '/Admin/AddApplications', 
        type: "POST", 
        dataType: "JSON", 
        data: { ApplicationsName: ApplicationsNameValue, MetricsChosenModel: MetricsChosenModel }, 
        success: function (returndata) { 
         if (returndata == true) { 
         } 
         else { 

         } 
        }, 
        error: function() { 
        } 
       }); 

我的控制器

public ActionResult AddApplications(string ApplicationsName,List<string> MetricsChosenModel) 
    { 

     //Code here 
     return View(); 
    } 

我MetricsChosenModel存儲在以下格式 MetricsChosenModel數據[0] => 5 MetricsChosenModel [1] => 6

爲什麼我不能收到MetricsChosenModel的列表值,我能夠接收應用程序名稱雖然,

而且它會是gre在如果有一個人能夠解釋,爲什麼我錯在這裏,

感謝,

回答

1

不知道你的路由是什麼樣子,很難查明問題的確切來源。如果我不得不猜測,我會說你通過URL(路由或查詢字符串參數)獲得了ApplicationsName的值。如果是這種情況,您可以將[FromBody]屬性添加到MetricsChosenModel。但請注意,每個方法簽名只允許使用一個FromBodyAttribute。如果你需要更多的變量,這個問題的一個簡單的解決方案是創建一個模型,其中包含你想要在控制器動作中獲得的每個屬性。

希望有幫助!

+0

編輯的問題是更確切的,我從我的文本框中獲取ApplicationsName,並在我的MetricsChosenModel中存儲「選擇combobox多個」信息。我的問題是爲什麼我無法將簡單的字符串變量'ApplicationsName'和列表'MetricsChosenModel'傳遞給我的控制器。雖然我能夠接收字符串變量'ApplicationsName',但不是列表 –

+0

我的答案保持不變:在所需的操作方法中將'[FromBody]'添加到'MetricsChosenModel'參數。因爲'ApplicationsName'參數的類型是一個原語(字符串),所以框架可以通過URL傳遞值作爲路由值或查詢字符串參數。但是,我不相信它會嘗試將列表值推入查詢字符串。因此,您需要從請求主體讀取該值。您可以通過運行Fiddlr來查看發佈的請求來測試我的理論。 –

1

我已經用ASP.NET MVC自己遇到了這個問題:發送帶有一些字段和一個或多個數組直到控制器的模型將無法將數組內容正確地獲取到C#模型中。以下變化Ajax調用每次修復它爲我:

  $.ajax({ 
       url: '/Admin/AddApplications', 
       type: "POST", 
       contentType: 'application/json; charset=utf-8', // ADD THIS 
       dataType: "JSON", 
       data: JSON.stringify({ ApplicationsName: ApplicationsNameValue, MetricsChosenModel: MetricsChosenModel }), // Also added JSON.stringify 
       success: function (returndata) { 
        if (returndata == true) { 
        } 
        else { 

        } 
       }, 
       error: function() { 
       } 
      }); 

的「內涵式」和'JSON.stringify的幫助MVC與轉換模型。請讓我知道,如果這對你也有幫助:)

+0

嗨伴侶,感謝您的回覆,我已經知道這stringify。但是你不認爲它是一個開銷?首先要Stringify並在控制器中進行解碼?假設列表中有100個項目。當我們可以在ajax調用中接收簡單的字符串時,爲什麼不列出我所有的問題。 –

+0

根據我的經驗,開銷可以忽略不計。在我們的應用程序中,我們通過這種方式發送了數千個(如果不是更多)相當複雜的對象的數組,沒有任何問題。我不知道爲什麼ASP的細節。沒有它,NET不能正確處理數組,因爲我主要關注前端,它與它使用的模型綁定邏輯有關。如果你不想串聯,我認爲你最好的選擇是掛鉤模型綁定器,看看它是什麼,以及是否可以通過重寫這個邏輯來修復它。我們已經嘗試過,但從來沒有完全正確。 –

+0

從技術上講,無論您爲傳輸選擇哪種格式,框架都必須解碼並執行模型綁定。通過忽略'content-type = application-json',你暗示着'multipart/form-data'的內容類型。如果您從網絡堆棧中排除json2.js庫,唯一真正潛在的明顯潛在的不必要開銷是。即使這樣,可能也不值得將JSON作爲格式選項。也就是說,我仍然認爲'[FromBody]'會解決你的問題;) –

相關問題