2015-02-28 21 views
23

W mojej aplikacji ASP.NET 5 MVC 6, chcę opublikować z Ajaxem pewne dane do mojego kontrolera. Zrobiłem to już z ASP.NET MVC 5 i przetestowałem dokładnie ten sam kod w pustym projekcie ASP.NET MVC 5 i zadziałało, ale z nową wersją nie mogę i nie wiem dlaczego. Po wywołaniu Ajax mogę przejść do kontrolera, model jest tworzony, ale pola mają wartość null (lub false dla wartości logicznej). Tu jest mój kodu:ASP.NET 5/MVC 6 Ajax post Model do kontrolera

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; } 
} 

jakieś pomysły? Dzięki

+0

próbował z '.done' zamiast sukcesu? – naveen

+0

To nie jest problem. Udało mi się przejść do kontrolera, ale pola wewnątrz mojego modelu są puste. –

+0

Twój DTO wydaje się być poprawny. hmmm – naveen

Odpowiedz

28

Trzeba wyraźnej użytku FromBody na MVC6 jeśli używasz json

public JsonResult Login([FromBody]LoginViewModel model) 

EDIT

Myślę, że mieszasz różne błędy. Postaram się opisać w jaki sposób należy dokonać żądanie:

Content-Type musi być: application/json

organizm prośba musi być w formacie JSON (jak sugeruje JasonLind):

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

to właśnie powinieneś zobaczyć podczas sprawdzania żądania (za pomocą narzędzi do debugowania chrome F12) lub używając inspektora żądającego, takiego jak skrzypek.

Jeśli widzisz coś w postaci UserName=Test&Password=Test&RememberMe=true, to robisz to źle, to jest format formularza.

Nie potrzebujesz zmiennej model. jeśli zobaczysz swoją prośbę z "opakowaniem", powinieneś ją usunąć.

+0

Już próbowałem, ale to też nie działa. Mój viewmodel został utworzony, ale jest pusty. –

+0

Dobrze, przetestowałem z tymi danymi: var data = { Nazwa użytkownika: 'Test', Hasło: 'Testuj', Hasło do zapamiętania: true }; I zadziałało. Dzięki ! : p –

+1

świetnie, po prostu stwierdził, co jest potrzebne w żądaniu. Cieszę się, że to rozwiązałeś: D –

0

Nie powinno to być:

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

    }; 
+0

Testowałem też, ale to nie działa –

+0

Dlaczego nie powinien być obiektem? –

0

Ok znalazłem rozwiązanie, ale to wciąż dziwne dla mnie ... Trzeba tylko usunąć content-type z żądania.

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

Znalazłem rozwiązanie dzięki strażnika :) Patrzyłem zmienną prośbę i stwierdziliśmy, że zawsze Request.Form rzucony wyjątek. Powiedział, że użyłem niewłaściwego typu zawartości, więc właśnie usunąłem content-type z mojego wpisu ajax i działało jak czar. Myślę, że dla każdego postu ajax będzie można dokonać, trzeba być ostrożnym, że Request.Form jest poprawnie wypełnione

enter image description here

EDIT: To rozwiązanie działa tylko wtedy, gdy można zakładać non-json dane (bardzo proste dane), takie jak dane dotyczące połączenia. Ale jeśli chcę pisać złożonych danych, takich jak listy, to już nie działa ...

+0

Jeśli chcesz używać typu zawartości, nie używaj json.stringify. – dotnetstep

+0

Przetestowałem bez json.stringify iz moim typem treści i nadal nie działa, pola zawsze były puste. –

0

Twój problem nie dotyczy MVC6 to jQuery. $ .ajax() sprawdzić „dane” i znać jego format tak ustawia typ treści na swoim, a także należy użyć $ .ajax w sposób obietnica

obietnic wyboru vantages here

a także wybrać forma i po prostu zamienić się do obiektu, jak

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

    }) 

i here jest metoda serializeObject(), to nie jest na jQuery domyślnie.

Powiązane problemy