2009-10-19 41 views
5

Thực tiễn tốt nhất để xác thực mô hình của tôi cho các hành động khác nhau, ví dụ như các quy tắc xác thực khác nhau để tạo và xóa là gì?Quy tắc xác thực khác nhau của asp.net mvc cho các hành động khác nhau

Cảm ơn!

Làm rõ: Tôi nghĩ rằng điều này cần làm rõ một số vì câu trả lời dường như không giải quyết được câu hỏi.

Ví dụ,

Tạo Person xác nhận có tên, tuổi và địa chỉ email là không sử dụng Xóa Person Xác nhận rằng Người không phải là một phụ huynh. Logic kinh doanh quy định rằng Cha mẹ không thể bị loại bỏ

Làm cách nào để có hai trường hợp xác thực khác nhau này?

Trả lời

2

Vì tôi hiểu bạn muốn kiểm soát nhiều hơn các quy tắc xác thực của mình. Bạn có thể thêm quy tắc xác thực theo cách thủ công như được mô tả tại đây: MVC 2.0 Client validation exposed Điều này cho phép bạn kiểm soát hoàn toàn cách tổ chức xác thực của bạn, quy tắc nào thêm vào hành động nào, v.v.

0

Đây có thể là tốt nhất để sử dụng Validator Toolkit for ASP.NET MVC

Bộ công cụ này tạo ra phía khách hàng và mã xác nhận phía máy chủ.

Đây là bài đăng trên blog gần đây compares different validation techniques and frameworks.

Nếu bạn đang sử dụng jQuery thì jQuery validation plugin đáng sử dụng. Tất nhiên bạn vẫn phải viết xác nhận phía máy chủ của riêng bạn (hoặc sử dụng một khung công tác khác cho nó).

1

Sử dụng thư viện xác thực như FluentValidation hoặc NHibernate Validators để thực hiện xác thực. Di chuyển mã này vào một trình kết nối mô hình sao cho bất cứ khi nào một mô hình được truyền, nó sẽ tự động xác nhận. Bạn có thể xem mô hình chất kết dính sau hoạt động với FluentValidation

public class FluentValidationModelBinder : DefaultModelBinder { 
     private readonly IValidatorFactory _validatorFactory; 

     public FluentValidationModelBinder(IValidatorFactory validatorFactory) { 
      _validatorFactory = validatorFactory; 
     } 

     protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) { 
      var model = bindingContext.Model; 
      base.OnModelUpdated(controllerContext, bindingContext); 
      IValidator validator = _validatorFactory.GetValidator(bindingContext.ModelType); 
      if (validator != null) { 
       var result = validator.Validate(model); 
       if (!result.IsValid) { 
        result.AddToModelState(bindingContext.ModelState, ""); 
       } 
      } 
     } 
    } 
0

Nếu bạn muốn sử dụng một trong vài khung xác nhận cho ASP.NET MVC (xval, dữ liệu Chú thích các thuộc tính, vv) và chỉ xác nhận một tập hợp con của các lĩnh vực của một mô hình cho một hành động cụ thể, dễ nhất giải pháp là sử dụng thuộc tính [Bind].

Trong khi tôi chắc chắn có thể nghĩ về trường hợp bạn chỉ muốn xác thực đối với một tập con của trường của mô hình (tức là trong hành động Create), tôi không thể nghĩ ra trường hợp bạn muốn xác thực cho một trường cụ thể hoàn toàn khác nhau giữa hai hành động khác nhau.

Dưới đây là một ví dụ đơn giản, sử dụng đối tượng Mô hình người cùng với thuộc tính Trình xác thực chú thích dữ liệu. Hành động CreateUpdate sẽ xác thực đối với một nhóm trường khác của mô hình.


Mẫu:

public class Person 
{ 
    [Required] 
    Int32 Id { get; set; } 

    [Required] 
    String FirstName {get; set;} 

    [Required] 
    String LastName {get; set;} 
} 


điều khiển Actions:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create([Bind(Exclude = "Id")] Person person) 
{ 
    // this action will not perform any validation checks against the Id property of the model 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Update(Person person) 
{ 
    // this action will perform validation checks against all model properties, including Id 
} 

Trong ví dụ trên, hành động Create sẽ hoàn toàn bỏ qua Id thuộc tính của đối tượng mô hình Person. Nó sẽ không cố gắng ràng buộc tài sản này, cũng như không cố gắng thực hiện bất kỳ xác nhận nào đối với nó. Kể từ khi một người sẽ không có một Id tại thời điểm tạo ra, điều này là chính xác những gì bạn muốn. Mặt khác, hành động Update sẽ ràng buộc và xác thực tất cả các thuộc tính của mô hình.

Thực tế là thuộc tính Bind được chỉ định trên đối số phương pháp có thể làm cho mã một chút ở phía xấu xí. Tuy nhiên, nếu danh sách Exclude dài, bạn luôn có thể thêm một số ngắt dòng bổ sung và khoảng trắng để giúp giảm mức độ xấu.

1

Làm rõ: Tôi nghĩ điều này cần làm rõ một số vì câu trả lời dường như không giải quyết được câu hỏi.

Ví dụ,

Tạo Người xác nhận có tên, tuổi và địa chỉ email là không sử dụng Xóa Person Xác nhận rằng Người không phải là một phụ huynh. Logic kinh doanh quy định rằng Cha mẹ không thể bị loại bỏ

Làm cách nào để có hai trường hợp xác thực khác nhau này?

"Đóng gói những gì khác nhau".

Một cách để thực hiện việc này là sử dụng mẫu Lệnh và áp dụng xác thực của bạn cho Lệnh thay vì Thực thể. Đây là một ví dụ đơn giản mà không sử dụng bất kỳ khung xác nhận nào, nhưng ý tưởng là như nhau.

public class Blub 
{ 
    public int BlubId { get; set; } 
    public string Name { get; set; } 
    public bool SomeBlockingCondition { get; set; } 
} 

public class BlubEditController : Controller 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Rename(int blubId) 
    { 
     var ctx = new DataContext(); 
     var blub = ctx.Blubs.Single(o => o.BlubId==blubId); 
     return ShowRenameForm(blub); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Rename(int blubId, RenameCommand cmd) 
    { 
     var ctx = new DataContext(); 
     var blub = ctx.Blubs.Single(o => o.BlubId==blubId); 

     cmd.Subject = blub; 

     if (cmd.Validate(ModelState, "cmd.")) 
     { 
      cmd.Execute(); 
      ctx.SubmitChanges(); 
      return RedirectToAction("Show", new { blubId = blubId }); 
     } 
     else 
     { 
      return ShowRenameForm(blub); 
     } 
    } 
} 

public class RenameCommand 
{ 
    public Blub Subject { get; set; } 

    public string Name { get; set; } 

    public bool Validate(ModelStateDictionary modelState, string prefix) 
    { 
     if (Subject.SomeBlockingCondition) 
     { 
      modelState.AddModelError(prefix + "SomeBlockingCondition", "No!"); 
      return false; // Optional shortcut return to prevent further validation. 
     } 

     if (String.IsNullOrEmpty(this.Name)) 
     { 
      modelState.AddModelError(prefix + "Name", "Seriously, no."); 
     } 

     return modelState.IsValid; 
    } 

    public void Execute() 
    { 
     Subject.Name = this.Name; 
    } 
} 
+0

Câu trả lời hay. Cảm ơn – user10479

0

Tôi nghĩ, trong trường hợp này, chỉ cần viết một số mã trong miền mô hình (BLL) của DELETE để phán xét nếu một số người có thể bị xóa, hoặc viết một số mã trong sql hoặc sp và trả về một giá trị để dành nếu xóa được thực hiện.

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