Domanda

Voglio essere in grado di inviare JSON in contrasto con i QueryStrings standard, quando si effettua un post ai miei controller in ASP.Net MVC. Ho la roba front-end funziona bene (costruzione e poi la presentazione miei oggetti JSON).

Il problema è sul lato di controllo dove i ModelBinders predefiniti forniti con il framework MVC non supportano questa.

Ho visto una combinazione di modi per aggirare questo, uno di loro è quello di applicare un filtro che prende l'oggetto come parametro, utilizza una libreria JSON di de-puntate, e aggiunge che i parametri di azione. Questo non è l'ideale.

L'altro, meglio, modo è quello di utilizzare un modello personalizzato Binder. Tutti quelli che ho visto anche se presumo si avrà solo un modello e che sarà una classe piuttosto che una variabile. Se si dispone di quelli più si rompe.

Qualcun altro ha incontrato questo? Un'idea che avevo era se potevo semplicemente ignorare offerte come MVC con il FormCollection e intercetta lì, sommando i valori alla raccolta me stesso e sperando MVC può fare il resto nel suo modo normale. Qualcuno sa se questo è possibile?

La questione chiave, credo, è che il mio problema non è con il legame perché i miei modelli vista non sono diversi per il modo in cui dove prima. Il problema sta ottenendo i valori dalla JSON Post.

Se ho ragione MVC ottenere sia i valori QueryString e lo mette nella collezione forma che viene poi utilizzato per ModelBinding. Quindi non dovrebbe essere il metodo corretto di cambiare il modo in cui il FormCollection viene assegnato?

Esempio di un'azione:

public ActionResult MyFirstAction(Int32 ID, PersonObject Person, ClassObject ClassDetails)
{
//etc
}

I normali lavori di rilegatura, JSON e non tutti l'esempio del modello raccoglitori non funzionerà neanche. La mia soluzione migliore finora è quello di convertire l'oggetto in un dizionario e anche se ogni ciclo param e abbinare in su. Non sembra l'ideale.

È stato utile?

Soluzione

Io uso un legante modello personalizzato per JSON come questo:

public class JsonModelBinder<T> : IModelBinder {
    private string key;

    public JsonModelBinder(string requestKey) {
        this.key = requestKey;
    }

    public object BindModel(ControllerContext controllerContext, ...) {
        var json = controllerContext.HttpContext.Request[key];
        return new JsonSerializer().Deserialize<T>(json);
    }
}

E poi legare in su in Global.asax.cs in questo modo:

ModelBinders.Binders.Add(
    typeof(Product),
    new JsonModelBinder<Product>("ProductJson"));

Si può leggere di più su questo qui: l'ereditarietà è Evil: The Epic Fail del DataAnnotationsModelBinder

Modifica

Il JsonModelBinder dovrebbe essere utilizzato sul parametro azione di controllo digitato come unico prodotto. L'Int32 e classObject dovrebbero ripiegare al DefaultModelBinder. Stai vivendo un risultato diverso?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top