簡體   English   中英

JSON在MVC 4中不發布包含1個項目的數組

[英]JSON doesn't post array with 1 item in MVC 4

我有我的MVC 4項目。 我有2個select有多個選項。

<select id="ReportDetailsSelectList" class="form-control ListBox valid" size="10" multiple="">
    <option value="ADMN">Administration</option>
    <option value="ARC">Adminstrative Resource Center</option>
    <option value="BALS">Balance Sheet</option>
</select>

<select id="ReportDetailsSelectList2" class="form-control ListBox valid" size="10" multiple="">
    <option value="ATL">Atlanta</option>
    <option value="BALT">Baltimore</option>
    <option value="BETH">Betheseda</option>
    <option value="CAMD">Camden</option>
</select>

<button id="btnSubmit" name="btnSubmit" type="button" class="btn btn-primary">Submit</button>

我需要從2個select列表中收集所有選擇的值,並將其發布到我的Action

這是我的JavaScript代碼:

$('#btnSubmit').click(function () {
    var result = [];
    // Go through Details List
    $('select#ReportDetailsSelectList option:selected').each(function () {
        // Collect Name and Value
        var item = {};
        item.Key = $(this).val();
        item.Value = $(this).text();
        result.push(item);
    });

    var result2 = [];
    // Go through Details List
    $('select#ReportDetailsSelectList2 option:selected').each(function () {
        // Collect Name and Value
        var item = {};
        item.Key = $(this).val();
        item.Value = $(this).text();
        result2.push(item);
    });

    CollectPostData(result, result2);
});

function CollectPostData(result, result2) {
    // Post collected data to the action
    $.ajax({
        url: "/Home/GenerateReport",
        type: "POST",
        data: JSON.stringify({ 'detailList': result, 'detailList2': result2 }),
        dataType: "json",
        traditional: true,
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            if (data.status == "Success") {
                alert(data.message);
            } else {
                alert("Error occurs on the Database level!");
            }
        },
        error: function () {
            alert("An error has occurred!!!");
        }
    });
}

我有一個簡單的類來存儲對象:

public class DetailList
{
    public string Key { get; set; }
    public string Value { get; set; }
}

這是我的Controller ActionResult:

[HttpPost]
public ActionResult GenerateReport(DetailList[] detailList, DetailList[] detailList2)
{
    return Json(new { status = "Success", message = "Success" }, JsonRequestBehavior.AllowGet);
}

這就是我的問題了...一些情況:

1) I have multiple option selected in both lists - data posted correctly:

在此處輸入圖片說明

2) Multiple options in 1st list, 1 option in 2nd list - data posted correctly

在此處輸入圖片說明

3) 1 option in 1st list, 1 option in 2nd list - First array is null, but the second array posted correctly:

在此處輸入圖片說明

我不知道為什么會這樣? 我以完全相同的方式收集兩個數組,並以相同的方式發布它,但是由於某些原因,它發布的方式有所不同。 我檢查了Firefox調試器,發現所有數據都已收集妥當。 即使有1個項目, resultresult2都具有數據...

有人,請幫助,我在這里做錯了什么?

得到它的工作。

問題在於,當您有多個POST參數時,MVC不會喜歡,至少在MVC 4中默認情況下不會。它希望所有POST數據都將作為一個對象發送。

這是我對您的代碼所做的更改。

添加以下類:

public class GenerateReportViewModel
{
    public DetailList[] ListA { get; set; }
    public DetailList[] ListB { get; set; }
}

更改您的操作方法簽名:

[HttpPost]
public ActionResult GenerateReport(GenerateReportViewModel viewModel)
{
    return Json(new { status = "Success", message = "Success" }, JsonRequestBehavior.AllowGet);
}

更改您的CollectPostData JavaScript函數:

function CollectPostData(result, result2) {
    // Post collected data to the action
    $.ajax({
        url: "/Home/GenerateReport",
        type: "POST",
        data: JSON.stringify({
            ListA: result,
            ListB: result2
        }),
        dataType: "json",
        contentType: 'application/json; charset=utf-8',
        success: function (data) {
            if (data.status == "Success") {
                alert(data.message);
            } else {
                alert("Error occurs on the Database level!");
            }
        },
        error: function () {
            alert("An error has occurred!!!");
        }
    });
}

MVC 5似乎進行了一些更改,使您可以更靈活地選擇自己的模式,這就是為什么我無法在此處進行復制。 通常,如果將POST數據全部放在一個對象中,則管理起來更容易。 您的操作方法將具有較少的參數(一個)。

這是另一個類似的SO問題,可以提供更多的見解:

使用C#將多個參數發布到MVC Controller

暫無
暫無

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

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