2012-03-07 32 views
7

Tôi đang sử dụng ASP.NET MVC Razor Và liệu Chú Validators mô hình của tôi:Asp.net MVC 3 Validation loại trừ một số xác nhận trường trong TryUpdateModel

public class Person 
{ 
    public int id { get; set; } 

    [Required] 
    public string FirstName { get; set; } 

    [Required] 
    public string LastName { get; set; } 
} 

FirstName LastName Và là Requerd. Tôi muốn chỉnh sửa FirstName. My Methode là:

public ActionResult Edit([Bind(Include = "FirstName")]Person person) 
{ 
    var p = GetPerson(); 
    if (TryUpdateModel(p)) 
    { 
     //Save Changes; 
    } 
} 

Nhưng TryUpdateModel luôn trả về giá trị sai. vì LastName không hợp lệ.

Làm cách nào tôi có thể Ngăn chặn xác thực kiểm tra của LastName trong TryUpdateModel?

Lưu ý:

  • Mã này được đơn giản hóa. mã thực của tôi là rất phức tạp
  • Tôi có để sử dụng requierd Đối với hai tài sản
  • Tôi không muốn sử dụng mẫu khác nhau Lớp

Trả lời

17

Tôi đã tìm thấy Giải pháp tốt. Tôi phải loại bỏ trường không sử dụng từ ModelState. sau đó ModelState.IsValid trả về true. đầu tiên tôi cần Tạo lớp thuộc tính mới:

public class ValidateOnlyIncomingValuesAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var modelState = filterContext.Controller.ViewData.ModelState; 
     var valueProvider = filterContext.Controller.ValueProvider; 

     var keysWithNoIncomingValue = modelState.Keys.Where(x=>!valueProvider.ContainsPrefix(x)); 
     foreach (var key in keysWithNoIncomingValue) 
      modelState[key].Errors.Clear(); 
    } 
} 

sau đó tôi Thêm Thuộc Tính trên tole của tôi:

[ValidateOnlyIncomingValuesAttribute] 
public ActionResult Edit([Bind(Include = "FirstName")]Person person) 
{ 
    var p = GetPerson(); 
    if (ModelState.IsValid) 
    { 
     TryUpdateModel(p); 
     //Save Changes; 
    } 
} 

Nhìn này: http://blog.stevensanderson.com/2010/02/19/partial-validation-in-aspnet-mvc-2/

4

ngắn Trả lời: Bạn không có thể, không sử dụng mặc định dữ liệu Chú thích.

Câu trả lời dài hơn: Bạn có một số tùy chọn.

  1. Bạn có thể tạo chú thích trình xác thực của riêng mình.
  2. Bạn có thể làm cho lớp mô hình của bạn kế thừa từ IValidatableObject và sau đó triển khai phương thức Xác thực. (Tuy nhiên, điều này không làm xác thực phía máy khách).
  3. Bạn có thể sử dụng thư viện xác thực của bên thứ ba chẳng hạn như FluentValidation.
  4. Bạn có thể tạo một mô hình khác cho trường hợp này.
  5. Bạn có thể xóa xác thực và chỉ cần thêm mã vào phương thức hành động để kiểm tra xem các trường có chính xác hay không. (điều này không được khuyến khích, vì điều này làm tăng sự phức tạp của hành động điều khiển của bạn, và bạn phải nhân đôi chức năng này ở bất cứ nơi nào bạn đang sử dụng mô hình này).
+0

được bạn Đảm bảo FluentValidation Giải quyết vấn đề? Tôi có thể sử dụng FluentValidation với EF không? – Morteza

+0

@MortezaTavakoli - Tôi không hiểu ý bạn là gì. Câu hỏi của bạn là về MVC chứ không phải EF. Mô hình EF của bạn phải khác với mô hình bạn xem. –

+0

EF không liên quan gì đến nó.Nó không quan trọng nếu nó là một mô hình EF hoặc mô hình khác. – RickAndMSFT

7

Một giải pháp rất đơn giản mà tôi đã tìm ra.

public ActionResult Edit(Person person) 
{ 
    ModelState.Remove("FirstName"); // This will remove the key 
    var p = GetPerson(); 
    if (TryUpdateModel(p)) 
     { 
      //Save Changes; 
     } 
    } 
} 
13

Bạn có thể loại bỏ các thuộc tính bạn không cần trước khi kiểm tra nếu mô hình này là hợp lệ

ModelState.Remove("Email"); 
if (ModelState.IsValid) 
{ 
    // whatever you want to do 
} 
Các vấn đề liên quan