2011-09-14 14 views
65

Tôi gặp phải tình huống khi tôi tải lên hình ảnh mà người dùng đã chọn từ hệ thống tệp cục bộ của mình. Mẫu của tôi theo quan điểm của tôi, về cơ bản có hai nút gửi. Một được sử dụng để gửi biểu mẫu bình thường và tất cả xác thực thực hiện. Thứ hai là chỉ để tải lên hình ảnh, trong trường hợp này tôi không muốn xác thực.MVC3 Xóa lỗi ModelState

tôi quản lý để tắt Khách hàng xác nhận Side bằng cách cho 'Upload Image' của tôi nút gửi một giá trị đẳng cấp của "phong cách tên hủy", do đó

<input type="submit" name="UploadImageButton" value="Upload Image" class="style-name cancel" /> 

Bây giờ, khi tôi gửi lại, mô hình của tôi có một tài sản UploadImageButton, khi nút này được nhấp, nó sẽ điền thuộc tính này (Tên của đầu vào khớp với Thuộc tính). Bằng cách này, tôi biết liệu biểu mẫu đã được gửi bởi nút Gửi thực sự của tôi hay bằng nút UploadImageButton.

Câu hỏi của tôi là ... Làm cách nào để tắt xác thực ServerSide? Tôi không muốn thông tin Tóm tắt xác thực hiển thị khi người dùng nhấp vào nút này. Tôi biết bạn có thể thêm lỗi mô hình tùy chỉnh bằng cách sử dụng

Tôi đang tìm phương tiện để xóa lỗi mô hình. Điều này có thể không?

EDIT:

Dưới đây là những gì tôi đã đưa ra:

foreach (var key in ModelState.Keys.ToList().Where(key => ModelState.ContainsKey(key))) { 
    //ModelState.Remove(key); //This was my solution before 
    ModelState[key].Errors.Clear(); //This is my new solution. Thanks bbak 
} 
+0

Tại sao cậu lại làm một 'ở đâu (key => ModelState.Keys.. Chứa (key)) '? Dường như mệnh đề Where là thừa, bởi vì mỗi khóa trong ModelState.Keys sẽ có ModelState.Keys.Contains (key) của nó trả về true. –

+1

Tôi đã cập nhật câu hỏi và văn bản, để sử dụng các phương pháp ngắn hơn trên ModelState.ContainsKey, mặc dù sai của bạn trong giả định của bạn. Đây là những điều tương tự. –

+0

Xin lỗi, tôi có thể đã giải thích kém hoặc hiểu lầm câu trả lời của bạn. Bạn nói đúng rằng 'ModelState.ContainsKey (key)' và 'ModelState.Contains (key)' làm điều tương tự, nhưng quan điểm của tôi là tất cả các giá trị trong 'ModelState.Keys.ToList()' sẽ tự nhiên được chứa trong 'ModelState', do đó, toàn bộ mệnh đề' Where' là thừa và sẽ làm chậm hiệu suất. Điều nhỏ, mặc dù. –

Trả lời

116

Bạn có thể loại bỏ các lỗi mô hình bằng cách làm một cái gì đó như thế này:

if (ModelState.ContainsKey("{key}")) 
    ModelState["{key}"].Errors.Clear(); 
+1

Đây chính xác là những gì tôi đang tìm kiếm. Tôi đã thay đổi câu trả lời đã chọn của mình (xin lỗi Adam Tuliper). –

+0

Cảm ơn, điều đó đã cứu tôi vài giờ! – Agent007

+0

Chỉ trong trường hợp bất cứ ai đã tự hỏi, điều này cũng ảnh hưởng đến 'ModelState.IsValid' –

55

này được xây dựng ra câu trả lời trước, nhưng đơn giản hóa nó nhiều hơn một chút:

foreach (var modelValue in ModelState.Values) 
{ 
    modelValue.Errors.Clear(); 
} 
6

Nói chung, bạn không muốn tắt xác thực phía máy chủ hoặc loại bỏ lỗi ModelState theo cách thủ công. Nó có thể thực hiện được, nhưng dễ xảy ra lỗi vì nó phải dựa vào các chuỗi như các phím. Tôi upvoted câu trả lời về làm thế nào để loại bỏ các phím, bởi vì nó là chính xác và hữu ích, nhưng tôi khuyên bạn nên chống lại thiết kế chính mình vào một trường hợp mà bạn phải mạnh mẽ xem xét nó.

Trong trường hợp của bạn, bạn có nhiều nút gửi cho cùng một biểu mẫu, nhưng bạn thực sự không gửi biểu mẫu khi bạn tải hình ảnh lên. Để ngăn chặn xác nhận phía máy khách, bạn có thể sử dụng lớp "hủy" như bạn đã chỉ ra, nhưng tôi cũng khuyên bạn nên có nút đệ trình thứ 2 dưới một hình thức khác, trong trường hợp đó không có xác nhận trên biểu mẫu chính của bạn.

Có một lợi thế thứ hai khi sử dụng biểu mẫu khác: bạn có thể gửi nó đến một phương pháp ActionResult khác mà chỉ xử lý logic tải lên hình ảnh. Phương pháp khác này chỉ đơn giản là không bận tâm kiểm tra thuộc tính "IsValid" của trạng thái mô hình: nó chỉ quan tâm nếu có thông tin trong hình ảnh và có thể được kiểm tra riêng biệt. (Ngay cả khi bạn sử dụng cùng một phương thức ActionResult, bạn có thể phễu logic để bạn không dựa vào thuộc tính IsValid của trạng thái mô hình.)

Nếu bạn phải xóa lỗi từ trạng thái mô hình, và nó làm cho tinh thần để xóa tất cả trong số họ, hãy thử này:

foreach (var key in ModelState.Keys) 
{ 
    ModelState[key].Errors.Clear(); 
} 

Điều này sẽ giúp bạn khỏi phụ thuộc vào việc những cái tên quan trọng đúng, nhưng bảo tồn các giá trị nên bất kỳ giá trị (có giá trị hoặc không hợp lệ) đã tồn tại trong mô hình.Một điều cuối cùng để kiểm tra trong những trường hợp này là liệu bạn có các giá trị đôi khi chỉ trong khung nhìn, điều này sẽ không gây ra xác thực phía máy khách (chúng không có trong khung nhìn), nhưng kết quả là trong máy chủ- các vấn đề xác nhận phụ. Trong trường hợp này, tốt nhất là sử dụng @ Html.HiddenFor (model => model.PropertyName, nếu bạn có thể, giả sử giá trị đã được đặt, nó sẽ không hiển thị trong dạng xem này.

4

Tôi thỉnh thoảng sử dụng nó , vì vậy tôi đã thực hiện một phương pháp mở rộng ra khỏi nó:

public static ModelStateDictionary ClearError(this ModelStateDictionary m, string fieldName) 
{ 
    if (m.ContainsKey(fieldName)) 
     m[fieldName].Errors.Clear(); 
    return m; 
} 

nó có thể được sử dụng thành thạo để xóa lỗi cho nhiều lĩnh vực