2015-02-28 16 views
23

Nella mia applicazione ASP.NET 5 MVC 6, desidero postare con Ajax alcuni dati sul mio controller. L'ho già fatto con ASP.NET MVC 5 e ho testato lo stesso codice esatto in un progetto vuoto ASP.NET MVC 5 e ha funzionato, ma con la nuova versione non posso e non so perché. Con la chiamata Ajax, posso andare al controller, il modello viene creato ma i campi sono nulli (o false per il booleano). Ecco il mio codice:ASP.NET 5/MVC 6 Ajax invia il modello al controller

script.js:

var data = { 
      model: { 
       UserName: 'Test', 
       Password: 'Test', 
       RememberMe: true 
      } 
     }; 

     $.ajax({ 
      type: "POST", 
      url: "/Account/Login/", 
      data: JSON.stringify(data), 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (msg) { 
       // Do something interesting here. 
      } 
     }); 

AccountController.cs:

[HttpPost] 
    public JsonResult Login(LoginViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      //var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false); 
      //if (result.Succeeded) 
      //{ 
      //  //return RedirectToLocal(returnUrl); 
      //} 

      ModelState.AddModelError("", "Identifiant ou mot de passe invalide"); 
      return Json("error-model-wrong"); 
     } 

     // If we got this far, something failed, redisplay form 
     return Json("error-mode-not-valid"); 
    } 

LoginViewModel.cs:

public class LoginViewModel 
{ 
    [Required] 
    [Display(Name = "UserName")] 
    [EmailAddress] 
    public string UserName { get; set; } 

    [Required] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    public string Password { get; set; } 

    [Display(Name = "Remember me?")] 
    public bool RememberMe { get; set; } 
} 

Tutte le idee? Grazie

+0

provato con '.done' invece di successo? – naveen

+0

Questo non è il problema. Sono andato con successo al controller, ma i campi all'interno del mio modello sono nulli. –

+0

il tuo DTO sembra essere corretto. hmmm – naveen

risposta

28

è necessario utilizzare esplicito FromBody su MVC6 se si utilizza JSON

public JsonResult Login([FromBody]LoginViewModel model) 

EDIT

Penso che stiate mescolando diversi errori. Cercherò di descrivere come si dovrebbe fare la richiesta:

tipo di contenuto deve essere: application/json

vostro corpo richiesta deve essere in formato JSON (come suggerito JasonLind):

{ 
    UserName: 'Test', 
    Password: 'Test', 
    RememberMe: true 
}; 

questo è ciò che si dovrebbe vedere durante l'ispezione della richiesta (tramite strumenti di debugger chrome F12) o utilizzando un ispettore di richiesta come il violinista.

Se vedi qualcosa sotto forma di UserName=Test&Password=Test&RememberMe=true allora stai sbagliando, quello è il formato del modulo.

non è necessaria la variabile model. se vedi la tua richiesta con un "wrapper" allora dovresti rimuoverla.

+0

L'ho già provato ma non funziona. Il mio viewmodel è stato creato ma è vuoto. –

+0

Ok, ho ripetuto il test con questi dati: var data = { UserName: 'Test', Password: 'Test', RememberMe: true }; E ha funzionato. Grazie ! : p –

+1

ottimo, ho appena detto cosa è necessario essere nella richiesta. felice di averlo risolto: D –

0

non dovrebbe essere:

var data = { 
      UserName: 'Test', 
      Password: 'Test', 
      RememberMe: true 

    }; 
+0

Ho provato anche io ma non funziona –

+0

Perché non dovrebbe essere oggetto? –

0

Ok ho trovato la soluzione, ma è ancora strano per me ... Basta rimuovere il content-type dalla richiesta.

$.ajax({ 
      type: "POST", 
      url: "Account/Login", 
      data: data, 
      success: function (msg) { 
       // Do something interesting here. 
      } 
     }); 

ho trovato la soluzione grazie alla osservatore :) ho guardato la variabile richiesta, e ho scoperto che Request.Form gettata sempre un'eccezione. Ho detto che ho usato un tipo di contenuto sbagliato, quindi ho rimosso lo content-type dal mio post ajax e ha funzionato come un incantesimo. Penso che, per ogni post Ajax si farà, bisogna stare attenti che il vostro Request.Form è riempito correttamente

enter image description here

EDIT: Questa soluzione funziona solo se puoiaffiggere non JSON dati (dati molto semplici), come i dati di connessione. Ma se voglio inviare dati complessi, come una lista, che non funziona più ...

+0

Se si desidera utilizzare il tipo di contenuto, non utilizzare json.stringify. – dotnetstep

+0

Ho provato senza json.stringify e con il mio tipo di contenuto e ancora non funziona, i campi erano sempre nulli. –

0

Il tuo problema non è MVC6 è jQuery. $ .ajax() controllare i "Dati" e conosce il suo formato in modo imposta il tipo di contenuto per il vostro, e inoltre si dovrebbe usare $ .ajax in modo promessa

promesse di controllo vantages here

ed anche selezionare il forma e basta girare in obiettare, come

$('.anyForm').on('submit', fucntion(){ 
     //you have the form in JSON format 
     var data = $(this).serializeObject() 

    }) 

e here è metodo serializeObject(), non è su jQuery per default.