2015-02-28 20 views
23

Trong ASP.NET MVC 5 6 ứng dụng của tôi, tôi muốn gửi với Ajax một số dữ liệu để điều khiển của tôi. Tôi đã làm điều này với ASP.NET MVC 5 và tôi đã thử nghiệm mã chính xác như nhau trong một ASP.NET MVC 5 dự án trống và nó làm việc, nhưng với phiên bản mới, tôi không thể và tôi không biết tại sao. Với cuộc gọi Ajax, tôi có thể đi đến bộ điều khiển, mô hình được tạo ra nhưng các lĩnh vực là null (hay sai cho boolean). Đây là mã của tôi:ASP.NET 5/MVC 6 Ajax bài mẫu đến 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; } 
} 

Bất kỳ ý tưởng? Cảm ơn

+0

thử với '.done' thay vì thành công? – naveen

+0

Đây không phải là vấn đề. Tôi thành công vào bộ điều khiển, nhưng các trường bên trong mô hình của tôi là null. –

+0

DTO của bạn có vẻ đúng. hmmm – naveen

Trả lời

28

Bạn cần phải FromBody sử dụng rõ ràng trên MVC6 nếu bạn đang sử dụng json

public JsonResult Login([FromBody]LoginViewModel model) 

EDIT

tôi nghĩ rằng bạn đang trộn lỗi khác nhau. Tôi sẽ cố gắng để mô tả cách bạn nên thực hiện theo yêu cầu:

content-type phải: application/json

cơ thể theo yêu cầu của bạn phải ở định dạng JSON (như JasonLind gợi ý):

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

đây là những gì bạn sẽ thấy khi kiểm tra yêu cầu (thông qua công cụ trình gỡ lỗi chrome F12) hoặc sử dụng trình kiểm tra yêu cầu như trình điều khiển.

Nếu bạn thấy nội dung nào đó ở dạng UserName=Test&Password=Test&RememberMe=true thì bạn đang làm sai, đó là định dạng biểu mẫu.

bạn không cần phải biến model. nếu bạn thấy yêu cầu của mình bằng "trình bao bọc" thì bạn nên xóa nó đi.

+0

Tôi đã thử nó nhưng nó cũng không hoạt động. Chế độ xem của tôi được tạo nhưng nó trống. –

+0

Ok, tôi đã thử lại với dữ liệu này: var data = { Tên người dùng: 'Test', Mật khẩu: 'Test', RememberMe: true }; Và nó hoạt động. Cảm ơn ! : p –

+1

tuyệt vời, chỉ cần nêu những gì cần thiết để có trong yêu cầu. vui mừng bạn đã giải quyết nó: D –

0

nên không nó là:

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

    }; 
+0

Tôi đã thử nghiệm quá nhưng nó không hoạt động –

+0

Tại sao nó không phải là đối tượng? –

0

Ok Tôi tìm thấy giải pháp, nhưng nó vẫn còn xa lạ đối với tôi ... Bạn chỉ cần loại bỏ các content-type từ yêu cầu.

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

Tôi đã tìm thấy giải pháp nhờ người quan sát :) Tôi đã xem biến Yêu cầu và tôi thấy rằng Request.Form luôn bị ném ngoại lệ. Nó nói rằng tôi đã sử dụng một content-type sai, vì vậy tôi chỉ cần loại bỏ các content-type từ bài ajax của tôi và nó làm việc như một nét duyên dáng. Tôi nghĩ rằng, đối với mỗi bài ajax bạn sẽ thực hiện, bạn phải cẩn thận rằng Request.Form của bạn được lấp đầy một cách chính xác

enter image description here

EDIT: Giải pháp này chỉ hoạt động khi bạn có thể gửi phi json dữ liệu (dữ liệu rất đơn giản), như các dữ liệu liên quan. Nhưng nếu tôi muốn gửi dữ liệu phức tạp, giống như một danh sách, nó không hoạt động nữa ...

+0

Nếu bạn muốn sử dụng loại nội dung thì không sử dụng json.stringify. – dotnetstep

+0

Tôi đã thử nghiệm mà không JSON.stringify và với content-type của tôi và nó vẫn không hoạt động, lĩnh vực luôn null. –

0

Vấn đề của bạn không phải là MVC6 là jQuery. $ .ajax() kiểm tra "dữ liệu" và biết định dạng của nó để thiết lập kiểu nội dung cho bạn, và bạn cũng nên sử dụng $ .ajax trong một thời trang hứa hẹn

lời hứa séc Vantages here

và cũng chọn và chỉ chuyển thành đối tượng, chẳng hạn như

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

    }) 

here là phương thức serializeObject(), nó không nằm trên jQuery theo mặc định.

Các vấn đề liên quan