2011-01-14 37 views
20

Tôi đã chơi với mô hình MVC3 Json Model Binding mới và nó khá đẹp.ASP.Net MVC 3 Ràng buộc mô hình JSON và xác thực mô hình phía máy chủ được trộn lẫn với xác thực phía máy khách

Hiện tại, tôi có thể đăng JSON để điều khiển và liên kết nó. Xác thực mẫu cũng xảy ra độc đáo.

Nhưng điều gì xảy ra nếu mô hình không hợp lệ?

Tôi muốn trả lại JSON và có các mặt hàng thông báo cho người sử dụng (như cách bạn muốn thực hiện bình thường xác nhận phía khách hàng trong MVC)

Có ai biết của một số hướng dẫn về cách để thực hiện điều này?

Điều này có thể thực hiện được không?

Hoặc có các khung công tác tôi có thể tận dụng để làm điều này không?

+0

How are you đăng JSON này? Bạn đang sử dụng AJAX? –

+0

có, đăng qua ajax –

+0

@TheCodeKing Bạn có đang liên kết lại câu hỏi này không? –

Trả lời

25

Ví dụ sau đây phù hợp với tôi khi sử dụng JavaScript không phô trương trong MVC3. Tôi đang làm một cái gì đó rất giống nhau. Với JsonResponse lớp sau:

public enum Status 
{ 
    Ok, 
    Error 
} 

public class JsonResponse 
{ 
    public Status Status { get; set; } 
    public string Message { get; set; } 
    public List<string> Errors { get; set; } 
} 

điều khiển của tôi có thể có một phương pháp như sau:

[HttpPost] 
public ActionResult Login(UserLoginModel model) 
{ 
    JsonResponse res = new JsonResponse(); 

    if (!ModelState.IsValid) 
    { 
     res.Status = Status.Error; 
     res.Errors = GetModelStateErrorsAsString(this.ModelState); 
     res.Message = "Oh dear, what have you done. Check the list of errors dude!"; 
    } 
    else 
    { 
     // Save it here... 

     // Return success 
     res.Status = Status.Ok; 
     res.Message = "Everything was hunky dory"; 
    }    

    return Json(res); 
} 

Và ModelStateDictionary có thể được liệt kê cho các lỗi như vậy:

private List<string> GetModelStateErrorsAsString(ModelStateDictionary state) 
{ 
    List<string> errors = new List<string>(); 

    foreach (var key in ModelState.Keys) 
    { 
     var error = ModelState[key].Errors.FirstOrDefault(); 
     if (error != null) 
     { 
      errors.Add(error.ErrorMessage); 
     } 
    } 

    return errors; 
} 

Sau đó, trong tôi xem Tôi có thể có Bài đăng JSON sau:

<script type="text/javascript"> 
$("form").submit(function (evt) { 
    // validate 
    $('form').valid(); 

    // extract values to submit   
    var form = $(this), 
     username = form.find("[name=Username]").val(), 
     password = form.find("[name=Password]").val(), 
     json = JSON.stringify({ 
      Username: username, 
      Password: password 
     }); 

    $.ajax({ 
     url: form.attr("action"), 
     type: 'POST', 
     contentType: 'application/json; charset=utf-8', 
     dataType: 'json', 
     data: json, 
     success: function (result) { 
      alert(result.Message); 
     } 
    }); 

    // stop form submitting 
    evt.preventDefault(); 
}); 
</script> 

Tôi đang sử dụng jQuery.tmpl để hiển thị lỗi. Tôi đã loại trừ nó từ ví dụ này mặc dù.

+2

cổ vũ cho câu trả lời .. Tôi không thể kiểm tra điều này vào lúc này vì tôi đang đi nghỉ. Tôi hy vọng bạn không nhớ nếu tôi rời khỏi này mở cho đến khi tôi nhận được trở lại? –

+0

@ Junto Tại sao không sử dụng boolean thay vì enum? – Rushino

+1

@Rushino Bạn có thể mở rộng enum để bao gồm các cảnh báo ví dụ hoặc thông tin. Boolean giới hạn bạn. – Junto

1

Cảm ơn giải pháp này. Tôi đã cải thiện nó một chút bằng cách chuyển từ điển để bạn có thể sử dụng javascript không phô trương để đặt xác nhận trên các trường riêng lẻ thay vì tóm tắt bằng cách tham chiếu khóa của từ điển.

private Dictionary<string, string> GetModelStateErrorsAsString(ModelStateDictionary state) 
    { 
     Dictionary<string, string> errors = new Dictionary<string, string>(); 
     foreach (var key in ModelState.Keys) 
     { 
      var error = ModelState[key].Errors.FirstOrDefault(); 
      if (error != null) 
      { 
       errors.Add(key, error.ErrorMessage); 
      } 
     } 
     return errors; 
    } 
+4

Tôi thực sự tự hỏi làm thế nào bạn ràng buộc các lỗi từ json đến biểu mẫu của bạn ở phía khách hàng - bạn có thể giải thích được không? – mb666

0

@Junto và @ Jamey777, cả hai bạn chuyển ModelState vào hàm lỗi nhưng sau đó bạn sử dụng biến toàn cục thay vì tham số.

và tại sao không bạn chỉ cần sử dụng một chút LINQ như

private Dictionary<string, string> GetModelStateErrorsAsString() 
    { 
     return ModelState.Where(x=> x.Value.Errors.Any()) 
      .ToDictionary(x => x.Key, x => x.Value.Errors.First().ErrorMessage); 
    } 
Các vấn đề liên quan