2015-02-28 13 views
23

मेरे एएसपी.नेट 5 एमवीसी 6 एप्लिकेशन में, मैं अपने नियंत्रक को कुछ डेटा अजाक्स के साथ पोस्ट करना चाहता हूं। मैंने पहले से ही एएसपी.नेट एमवीसी 5 के साथ ऐसा किया है और मैंने रिक्त एएसपी.नेट एमवीसी 5 प्रोजेक्ट में सटीक उसी कोड का परीक्षण किया है और यह काम करता है, लेकिन नए संस्करण के साथ मैं नहीं कर सकता और मुझे नहीं पता कि क्यों। अजाक्स कॉल के साथ, मैं नियंत्रक के पास जा सकता हूं, मॉडल बनाया गया है लेकिन फ़ील्ड शून्य हैं (या बुलियन के लिए झूठी)।एएसपी.नेट 5/एमवीसी 6 अजाक्स पोस्ट नियंत्रक को मॉडल

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

कोई भी विचार यहाँ मेरी कोड है? धन्यवाद

+0

सफलता के बजाय '.done' के साथ प्रयास किया? – naveen

+0

यह समस्या नहीं है। मैं सफलतापूर्वक नियंत्रक के पास जाता हूं, लेकिन मेरे मॉडल के अंदर के मैदान शून्य हैं। –

+0

आपका डीटीओ सही लगता है। हमम – naveen

उत्तर

28

आप MVC6 पर स्पष्ट FromBody उपयोग करने की जरूरत है अगर आप json

public JsonResult Login([FromBody]LoginViewModel model) 

संपादित

उपयोग कर रहे हैं

मुझे लगता है कि आप विभिन्न त्रुटियों को मिला रहे हैं। मैं वर्णन करने के लिए कैसे आप अनुरोध भेजना चाहिये की कोशिश करेंगे:

सामग्री प्रकार होना चाहिए: आवेदन/json

आपके अनुरोध शरीर JSON प्रारूप में (के रूप में JasonLind सुझाव) होना चाहिए:

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

यह अनुरोध है कि आप अनुरोध (निरीक्षण क्रोम डीबगर उपकरण F12 के माध्यम से) या फिडलर जैसे अनुरोध निरीक्षक का उपयोग करते समय देखना चाहिए।

यदि आप UserName=Test&Password=Test&RememberMe=true के रूप में कुछ देखते हैं तो आप इसे गलत कर रहे हैं, यह फ़ॉर्म प्रारूप है।

आपको model चर की आवश्यकता नहीं है। यदि आप "आवरण" के साथ अपना अनुरोध देखते हैं तो आपको इसे हटा देना चाहिए।

+0

मैंने पहले से ही कोशिश की है लेकिन यह भी काम नहीं करता है। मेरा व्यूमोडेल बनाया गया है लेकिन यह खाली है। –

+0

ठीक है, मैंने इस डेटा के साथ दोबारा जवाब दिया: var data = { उपयोगकर्ता नाम: 'टेस्ट', पासवर्ड: 'टेस्ट', याद रखें: सत्य }; और यह काम किया। धन्यवाद ! : पी –

+1

महान, बस कहा गया है कि अनुरोध में क्या होना आवश्यक है। खुशी है कि आपने इसे हल किया: डी –

0

यह होना चाहिए नहीं:

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

    }; 
+0

मैंने भी परीक्षण किया लेकिन यह –

+0

काम नहीं करता है क्यों यह ऑब्जेक्ट नहीं होना चाहिए? –

0

ठीक है, मैं समाधान नहीं मिला, लेकिन यह अभी भी मेरे लिए अजीब बात है ... तुम सिर्फ अनुरोध से content-type निकालना होगा।

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

मैं द्रष्टा का हल धन्यवाद मिल गया है :) मैं अनुरोध चर देखा, और मैंने पाया कि Request.Form हमेशा एक अपवाद फेंका। यह कहा गया कि मैंने गलत सामग्री-प्रकार का उपयोग किया है, इसलिए मैंने अपने AJAX पोस्ट से content-type हटा दिया और यह एक आकर्षण की तरह काम किया। मुझे लगता है कि, हर ajax पोस्ट आप कर देगा के लिए, आपको सावधान रहने की है कि अपने Request.Form सही ढंग से भर जाता है

enter image description here

संपादित है: यह समाधान केवल काम करता है जब आप पोस्ट कर सकता गैर json डेटा (बहुत सरल डेटा), कनेक्शन डेटा की तरह। लेकिन अगर मैं जटिल डेटा पोस्ट चाहते हैं, एक सूची की तरह, यह अब और काम नहीं करता है ...

+0

यदि आप सामग्री प्रकार का उपयोग करना चाहते हैं तो json.stringify का उपयोग न करें। – dotnetstep

+0

मैंने json.stringify के बिना परीक्षण किया और मेरी सामग्री-प्रकार के साथ और यह अभी भी काम नहीं करता है, फ़ील्ड हमेशा शून्य थे। –

0

आपकी समस्या एमवीसी 6 jQuery नहीं है। $ .ajax() "डाटा" की जाँच करें और पता अपने प्रारूप तो अपने लिए सामग्री प्रकार निर्धारित करता है, और यह भी आप $ .ajax एक वादा फैशन में

जांच वादों का उपयोग करना चाहिए here

vantages है और यह भी चयन फार्म और बस

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

    }) 

और here की तरह, आपत्ति उठाने में बदल जाते हैं, serializeObject() विधि है यह jQuery पर डिफ़ॉल्ट रूप से नहीं है।

संबंधित मुद्दे