2011-06-15 34 views
53

Tôi đang sử dụng mã ASP.NET MVC 3 đầu tiên và tôi đã thêm chú thích dữ liệu xác thực vào mô hình của mình. Dưới đây là một mô hình ví dụ:Bằng tay gọi xác thực ModelState

public class Product 
{ 
    public int ProductId { get; set; } 

    [Required(ErrorMessage = "Please enter a name")] 
    public string Name { get; set; } 

    [Required(ErrorMessage = "Please enter a description")] 
    [DataType(DataType.MultilineText)] 
    public string Description { get; set; } 

    [Required(ErrorMessage = "Please provide a logo")] 
    public string Logo { get; set; } 
} 

Trong trang web của tôi, tôi có một quy trình nhiều bước để tạo ra một sản phẩm mới - bước 1 bạn nhập chi tiết sản phẩm, bước 2 thông tin khác vv giữa mỗi bước tôi đang lưu trữ từng đối tượng (tức là một đối tượng sản phẩm) trong phiên, vì vậy người dùng có thể quay trở lại giai đoạn đó của quá trình và sửa đổi dữ liệu họ đã nhập.

Trên mỗi màn hình, tôi có xác thực phía máy khách làm việc với tiền phạt xác thực jQuery mới.

Giai đoạn cuối cùng là màn hình xác nhận sau đó sản phẩm được tạo trong cơ sở dữ liệu. Tuy nhiên vì người dùng có thể nhảy giữa các giai đoạn, tôi cần phải xác thực các đối tượng (Sản phẩm và một số người khác) để kiểm tra xem họ đã hoàn thành dữ liệu chính xác chưa.

Có cách nào để lập trình gọi xác nhận ModelState trên đối tượng có chú thích dữ liệu không? Tôi không muốn phải đi qua từng thuộc tính trên đối tượng và thực hiện xác nhận thủ công.

Tôi mở để gợi ý về cách để cải thiện quá trình này nếu nó làm cho nó dễ dàng hơn để sử dụng các tính năng mô hình xác nhận của ASP.NET MVC 3.

Trả lời

68

Bạn có thể gọi phương thức ValidateModel trong một hành động Controller (documentation here).

+12

Cảm ơn, tôi sử dụng TryUpdateModel() cuối cùng vì vậy tôi không có trường hợp ngoại lệ huy động. –

2

Tôi thấy điều này để làm việc và làm chính xác như mong đợi .. thấy ValidationSummary cho một đối tượng vừa mới lấy ra trên một phương pháp hành động GET ... trước khi bất kỳ POST

Me.TryValidateModel(MyCompany.OrderModel) 
35

Bạn có thể sử dụng ValidateModel hoặc TryValidateModel trong phạm vi điều khiển.

Khi một mô hình đang được xác thực, tất cả các xác nhận cho tất cả các tài sản sẽ chạy nếu ít nhất một hình thức đầu vào được ràng buộc với một bất động sản mô hình. ValidateModel giống như phương thức TryValidateModel ngoại trừ phương thức TryValidateModel không ném ngoại lệ InvalidOperationException nếu xác thực mô hình không thành công.

ValidateModel - ném ngoại lệ nếu mô hình không hợp lệ.

TryValidateModel - trả về giá trị bool cho biết nếu mô hình hợp lệ.

Nếu bạn xác thực danh sách mô hình từng cái một, bạn sẽ muốn đặt lại ModelState cho mỗi lần lặp lại bằng cách gọi ModelState.Clear().

Link to MSDN

+0

Tôi có một trường bắt buộc rỗng và được sử dụng "ModelState.Clear()" và ModelState.IsValid là đúng. –

+1

Nó hoạt động khi tôi đặt "ModelState.Clear();" và "TryValidateModel (myModel);".Cảm ơn –

+0

Điều này có vẻ hiển nhiên sau khi bạn nghĩ về nó, nhưng phương thức 'Validate' tùy chỉnh của bạn ** sẽ không được gọi ** nếu có bất kỳ lỗi xác nhận nào trong các thuộc tính xác nhận hợp lệ. – Jess

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