2012-03-01 16 views
6

Tất cả quá thường xuyên tôi gặp phải tình huống trong đó chế độ xem trong dự án của tôi ném một ngoại lệ tham chiếu null.Lượt xem MVC3: Xử lý các mô hình null với finesse

@model Johnny.Application.TestModel 
<div>@(Model.SomeText)</div> 

này ném một lỗi nếu Mẫurỗng.

Nhưng mọi người xử lý như thế nào? Tôi chắc chắn không nhìn thấy mẫu mã ở khắp mọi nơi với kiểm tra null xấu xí xả rác mã trong xem. Điều đó khiến tôi tin rằng hầu hết thời gian, các bộ điều khiển không được trả về các mô hình null. Nhưng làm thế nào bạn có thể thực thi điều này với sự khéo léo hơn?

Ngay bây giờ ngay khi ai đó vô tình khiến bộ điều khiển trả về mô hình không có giá trị, mô hình xem sẽ thổi lên và có vẻ như có lỗi. Trong thực tế, đó là lỗi của bộ điều khiển. Và quan điểm có thể thậm chí không "nắm bắt" vấn đề, nó sẽ chỉ làm như vậy nếu các thành viên của mô hình xảy ra để có được sử dụng (đó là hầu hết thời gian, tất nhiên).

Vì nhiều lý do khác nhau, một số chế độ xem có thể muốn xử lý các giá trị rỗng. Mặc dù vậy, tôi không cho rằng đây là trường hợp đa số. Rõ ràng đây là vấn đề đặt một số "hợp đồng" giữa chế độ xem và bộ điều khiển.

tôi không thích các tùy chọn Tôi đã nhìn thấy:

  1. Kiểm tra xem mô hình là null mỗi khi nó được sử dụng. Rất què!
  2. Một tuyên bố lớn nếu gói toàn bộ chế độ xem bằng mẫu rỗng kiểm tra. Hãy nghĩ đến mã bất động sản bị lãng phí. Què!
  3. Thêm nếu kiểm tra bằng một cú ném ở trên cùng. Không tệ, nhưng có vẻ ngớ ngẩn. Hơi xấu hổ.

Tôi rất thích biết nếu một cái gì đó giống như các tùy chọn này tồn tại để thiết lập "no null" hợp đồng:

  • Một thuộc tính vào phương pháp điều khiển như [NoNullModels]. Tôi nghi ngờ điều này tồn tại, vì tôi không nghĩ rằng bộ điều khiển biết những gì xem nó là hooking lên đến.
  • Trong giao diện, một chỉ báo như @ MVC3.HeyDontAllowNulls hoặc một số cách tiêu chuẩn khác của ném một ngoại lệ (như tùy chọn 3 nêu trên)
+0

tại sao bạn thậm chí sẽ trả về một mô hình không? –

+1

bạn đã thử '@ Html.DisplayFor (m => m.SomeText)' –

+0

Về chủ đề mẫu mã, 99% mẫu mã trên Internet không có xử lý ngoại lệ và xác thực đầu vào. Một phần ra khỏi sự lười biếng và một phần vì nó sẽ gây nhầm lẫn cho điểm mà các mẫu mã được minh họa. –

Trả lời

2

Tôi hỏi một câu hỏi tương tự ở đây Should one try to guard against null reference exceptions/index out of bounds exceptions in MVC views? và có phản ứng tốt với nó. Trong ngắn hạn, nó được ưa thích để thêm kiểm tra null trong bộ điều khiển của bạn và thậm chí có thể kiểm tra đơn vị hơn là trong quan điểm của bạn.

+0

Tôi đã không nghĩ đến phương pháp thử nghiệm đơn vị, và đây là một kịch bản tốt cho tiện ích của họ. Vì tôi không "sở hữu" tất cả các mã, tôi sẽ không thể làm cho tất cả các đơn vị bộ điều khiển có thể kiểm tra được, vì vậy tôi hy vọng sẽ tìm thấy một tùy chọn dự phòng cho khung nhìn trong các trường hợp này. –

+0

Tôi cũng thừa nhận rằng nếu tôi có, một cái nhìn được chia sẻ rất cao đã được đưa ra từ nhiều phương pháp hành động, tôi chắc chắn sẽ bị cám dỗ để thêm một kiểm tra rỗng ở một nơi, trong chính nó, chứ không phải trong một tá những nơi khác ngay cả khi tôi đã sở hữu tất cả mã. Bạn có thể gọi đó là sự tuân thủ nguyên tắc DRY với chi phí vi phạm tách biệt các mối quan tâm của MVC một chút. –

+0

Tôi càng nghĩ về điều đó, tôi càng cảm thấy rằng khung cảnh là nơi thích hợp để thêm một cái gì đó. Một lý do là một hành động điều khiển đơn có thể định tuyến đến một vài khung nhìn khác nhau. Việc sửa chữa nó ở phía bộ điều khiển không hiệu quả, vì nó sẽ làm rò rỉ sớm hay muộn (như tình huống mà tôi tiếp tục chạy vào!) –

0

Có rất nhiều ưu đãi về đây, một số bạn có thể làm là:

  1. Ném RecordNotFoundException trong lớp dữ liệu của bạn (tùy chỉnh ngoại lệ) và có một bộ lọc ngoại lệ bắt toàn cầu này
  2. Kiểm tra cho null trở lại từ lưu trữ và xử lý của bạn trong trường hợp theo trường hợp
  3. Trang trí bộ điều khiển của bạn để tìm kiếm một mô hình null trên phương thức GET không tạo phương thức (hoặc bất kỳ quy tắc nào bạn cho là OK) với thuộc tính bộ lọc hành động để kiểm tra điều này trong OnActionExecuted

Thậm chí, chế độ xem "TẠO" của tôi thường nhận được một mô hình, ngay cả khi trống (mặc dù thường có một sốIEnumerable > trong đó), vì vậy chúng phải luôn có mô hình.

0

Tôi kiểm tra các giá trị rỗng trong quan điểm của tôi đôi khi trong các phần của nó yêu cầu nó.

Tôi cũng sẽ đôi khi tạo giá trị mặc định trong bộ điều khiển của tôi nếu có giá trị null tùy thuộc vào những gì bạn đang cố gắng làm và những gì có thể chấp nhận được.

Tôi có ví dụ như trường hợp mọi người đăng ký một thứ gì đó và đặt thông báo. Nếu họ không có thông báo, một đối tượng phụ của mô hình của tôi là null. Tôi không muốn đặt giá trị mặc định để tôi có séc ở đó. Trong các phần khác tôi chỉ sử dụng một giá trị mặc định.

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