it-swarm.com.de

Wie kann ich ein Array von Zeichenfolgen ohne Formular an ASP.NET MVC Controller senden?

Ich erstelle eine kleine App, um mir ASP.NET MVC und JQuery beizubringen, und eine der Seiten enthält eine Liste von Elementen, in denen einige ausgewählt werden können. Dann möchte ich einen Knopf drücken und eine Liste (oder etwas Äquivalentes) an meinen Controller senden, die die IDs der Elemente enthält, die mit der Post-Funktion von JQuery ausgewählt wurden.

Ich habe es geschafft, ein Array mit den IDs der ausgewählten Elemente zu erhalten, und jetzt möchte ich das posten. Eine Möglichkeit, dies zu tun, besteht darin, auf meiner Seite ein Dummy-Formular mit einem ausgeblendeten Wert zu erstellen und dann den ausgeblendeten Wert für die ausgewählten Elemente festzulegen und dieses Formular zu veröffentlichen. das sieht allerdings krumm aus.

Gibt es eine sauberere Möglichkeit, dies zu erreichen, indem das Array direkt an den Controller gesendet wird? Ich habe ein paar verschiedene Dinge ausprobiert, aber es sieht so aus, als ob der Controller die empfangenen Daten nicht zuordnen kann. Hier ist der Code soweit:

function generateList(selectedValues) {
   var s = {
      values: selectedValues //selectedValues is an array of string
   };
   $.post("/Home/GenerateList", $.toJSON(s), function() { alert("back") }, "json");
}

Und dann sieht mein Controller so aus

public ActionResult GenerateList(List<string> values)
{
    //do something
}

Alles, was ich bekommen habe, ist eine "Null" im Controller-Parameter ...

Irgendwelche Tipps?

177
rodbv

Ich habe meine Antwort so geändert, dass sie den Code für eine Test-App enthält, die ich erstellt habe.

pdate: Ich habe die jQuery aktualisiert, um die 'traditionelle' Einstellung auf true zu setzen, damit dies wieder funktioniert (laut @DustinDavis 'Antwort).

Zuerst das Javascript:

function test()
{
    var stringArray = new Array();
    stringArray[0] = "item1";
    stringArray[1] = "item2";
    stringArray[2] = "item3";
    var postData = { values: stringArray };

    $.ajax({
        type: "POST",
        url: "/Home/SaveList",
        data: postData,
        success: function(data){
            alert(data.Result);
        },
        dataType: "json",
        traditional: true
    });
}

Und hier ist der Code in meiner Controller-Klasse:

public JsonResult SaveList(List<String> values)
{
    return Json(new { Result = String.Format("Fist item in list: '{0}'", values[0]) });
}

Wenn ich diese Javascript-Funktion aufrufe, erhalte ich die Warnmeldung "Erster Artikel in der Liste: 'Artikel1'". Hoffe das hilft!

242
MrDustpan

Zu Ihrer Information: JQuery hat die Art der Serialisierung von Post-Daten geändert.

http://forum.jquery.com/topic/nested-param-serialization

Sie müssen die Einstellung 'Traditional' auf true setzen, ansonsten

{ Values : ["1", "2", "3"] }

wird kommen als

Values[]=1&Values[]=2&Values[]=3

anstatt

Values=1&Values=2&Values=3
106
Dustin Davis

Vielen Dank an alle für die Antworten. Eine andere schnelle Lösung ist die Verwendung der jQuery.param -Methode mit traditionell -Parametern, die auf wahr gesetzt sind, um das JSON-Objekt in einen String umzuwandeln:

$.post("/your/url", $.param(yourJsonObject,true));
24
Evgenii

Im .NET4.5, MVC 5

Javascript:

objekt in JS: enter image description here

mechanismus, der postet.

    $('.button-green-large').click(function() {
        $.ajax({
            url: 'Quote',
            type: "POST",
            dataType: "json",
            data: JSON.stringify(document.selectedProduct),
            contentType: 'application/json; charset=utf-8',
        });
    });

C #

Objekte:

public class WillsQuoteViewModel
{
    public string Product { get; set; }

    public List<ClaimedFee> ClaimedFees { get; set; }
}

public partial class ClaimedFee //Generated by EF6
{
    public long Id { get; set; }
    public long JourneyId { get; set; }
    public string Title { get; set; }
    public decimal Net { get; set; }
    public decimal Vat { get; set; }
    public string Type { get; set; }

    public virtual Journey Journey { get; set; }
}

Regler:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Quote(WillsQuoteViewModel data)
{
....
}

Objekt erhalten:

enter image description here

Hoffe das spart dir etwas Zeit.

6

Eine andere Implementierung, die auch mit einer Liste von Objekten arbeitet, nicht nur mit Zeichenfolgen:

JS:

var postData = {};
postData[values] = selectedValues ;

$.ajax({
    url: "/Home/SaveList",
    type: "POST",
    data: JSON.stringify(postData),
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    success: function(data){
        alert(data.Result);
    }
});

Angenommen, 'selectedValues' ist ein Array von Objekten.

In der Steuerung ist der Parameter eine Liste der entsprechenden ViewModels.

public JsonResult SaveList(List<ViewModel> values)
{    
    return Json(new { 
          Result = String.Format("Fist item in list: '{0}'", values[0].Name) 
    });
}
4
d.popov

Wie ich schon sagte hier ,

wenn Sie ein benutzerdefiniertes JSON-Objekt an eine MVC-Aktion übergeben möchten, können Sie diese Lösung verwenden. Sie funktioniert wie ein Zauber.

    public string GetData()
    {
        // InputStream contains the JSON object you've sent
        String jsonString = new StreamReader(this.Request.InputStream).ReadToEnd();

        // Deserialize it to a dictionary
        var dic = 
          Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<String, dynamic>>(jsonString);

        string result = "";

        result += dic["firstname"] + dic["lastname"];

        // You can even cast your object to their original type because of 'dynamic' keyword
        result += ", Age: " + (int)dic["age"];

        if ((bool)dic["married"])
            result += ", Married";


        return result;
    }

Der eigentliche Vorteil dieser Lösung besteht darin, dass Sie nicht für jede Kombination von Argumenten eine neue Klasse definieren müssen. Außerdem können Sie Ihre Objekte auf einfache Weise in ihre ursprünglichen Typen umwandeln.

und Sie können eine Hilfsmethode wie diese verwenden, um Ihre Arbeit zu erleichtern

public static Dictionary<string, dynamic> GetDic(HttpRequestBase request)
{
    String jsonString = new StreamReader(request.InputStream).ReadToEnd();
    return Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(jsonString);
}
1
Mohsen Afshin

Mit können Sie globale Parameter einstellen

jQuery.ajaxSettings.traditional = true;
0
mr_squall