2015-02-28 23 views
23

ASP.NET 5 MVC 6 uygulamasında, Ajax ile bazı verileri denetleyicime göndermek istiyorum. Bunu ASP.NET MVC 5 ile zaten yaptım ve boş bir ASP.NET MVC 5 projesinde tam olarak aynı kodu test ettim ve çalıştı, ancak yeni sürümü ile yapamam ve neden bilmiyorum. Ajax çağrısı ile, denetleyiciye gidebilirim, model oluşturulur, ancak alanlar boştur (veya boole için yanlıştır).ASP.NET 5/MVC 6 Ajax gönderi Denetleyici Model

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

Herhangi bir fikir İşte benim kodudur?

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

    }; 
+0

Başarı yerine ".done" ile denendi? – naveen

+0

Sorun bu değil. Denetleyiciye başarıyla gidiyorum, ancak modelimin içindeki alanlar boş. –

+0

DTO'nuz doğru görünüyor. hmmm – naveen

cevap

28

Sen MVC6 üzerinde açık kullanım FromBody gerekir ... artık çalışmıyor

Farklı hataları karıştırıyorsunuz. Sana isteğinde bulunması gerektiğinde nasıl tarif dener:

içerik türü olmalıdır: application/json

isteğiniz vücut (JasonLind önerdiği gibi) JSON biçiminde olmalıdır:

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

Bu, isteği incelerken (krom hata ayıklama araçları F12 aracılığıyla) veya kemancı gibi bir istek denetçisi kullanırken görmeniz gereken şeydir.

UserName=Test&Password=Test&RememberMe=true biçiminde bir şey görürseniz, yanlış yapıyorsunuz, bu biçim biçimi.

model değişkenine ihtiyacınız yoktur. İsteğinizi "sarıcı" ile görüyorsanız, bunu kaldırmanız gerekir.

+0

Zaten denedim ama işe yaramıyor. Görüntü modelim oluşturuldu ancak boş. –

+0

Tamam, bu verilerle tekrar test ettim: var data = { Kullanıcı Adı: 'Test', Şifre: 'Test', RememberMe: true }; Ve işe yaradı. Teşekkürler ! : p –

+1

harika, sadece talepte bulunması gerekenleri belirtti. Çözdüğünüze sevindim: D –

0

olması gerekmiyor.

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

Ben Habercisi çözüm sayesinde buldum :) Ben isteği değişkeni izledim ve ben Request.Form hep bir özel durum ortaya koymuştur. Yanlış bir içerik türü kullandığımı söyledi, bu yüzden ajax yayınımdan content-type'u kaldırdım ve bir çekicilik gibi çalıştı. Sana yapacak her ajax yazı için, size Request.Form

enter image description here

DÜZENLEME doğru doldurulur dikkatli olmak zorunda, düşünüyorum: Bu çözüm olmayan json sonrası olabilir ne zaman çalışır Connexion verileri gibi veriler (çok basit veriler). Karmaşık veri göndermek isterseniz json

public JsonResult Login([FromBody]LoginViewModel model) 

DÜZENLEME

kullanıyorsanız Ama, bir liste gibi,
+0

Ben de test ettim ama işe yaramıyor –

+0

Neden nesne olmamalı? –

0

Tamam ben çözümü buldum ama ... benim için hala sadece istekten content-type kaldırmak zorunda garip: Teşekkür

+0

İçerik türünü kullanmak istiyorsanız, json.stringify kullanmayın. – dotnetstep

+0

json.stringify olmadan test ettim ve içerik türümde hala çalışmıyor ve alanlar her zaman boştu. –

0

Sorununuz MVC6 jQuery değil. $ .ajax() "verileri" onay ve şunlara ait olan formatının bu kadar içerik türünü belirler biliyorum ve ayrıca bir söz moda

çek vaat $ .ajax kullanmalıdır here

Vantages ve ayrıca seçin formu ve sadece

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

    }) 

ve here gibi, nesneye dönüşür varsayılan olarak jQuery üzerinde değil, serializeObject() yöntemidir.