2008-12-15 63 views
6

Tôi hiện đang sử dụng ModelStateDictionary trong asp.net mvc để giữ lỗi xác thực và chuyển sau đó quay lại người dùng. Có thể kiểm tra xem toàn bộ mô hình có hợp lệ với ModelState.IsValid hay không. Tuy nhiên, một ứng dụng hiện tại tôi đang làm việc có nhu cầu có thể báo cáo cảnh báo. Đây không phải là quan trọng nên nội dung biểu mẫu vẫn có thể được lưu, nhưng chúng sẽ được hiển thị cho người dùng để có thể tùy chọn hành động.Cảnh báo mô hình trong ASP.NET MVC

Tôi đã xem xét qua khuôn khổ để xem liệu có bất kỳ vị trí rõ ràng nào để mở rộng nó để cho phép tôi thực hiện điều này hay không. Tôi đang nghĩ rằng một từ điển khác có cảnh báo và một lớp con của lỗi mô hình được gọi là cảnh báo mô hình. Tôi không chắc làm thế nào tôi muốn có được khuôn khổ để sử dụng các lớp container mới của tôi trong xem vv mặc dù, tôi vẫn muốn tất cả các công cụ lỗi hiện có để làm việc.

Nếu có ai đó đã thử bất cứ điều gì tương tự hoặc có bất kỳ suy nghĩ nào tôi đánh giá cao ý kiến ​​của họ.

Cập nhật:

Tôi đã có như xa như mở rộng ViewDataDictionary để thêm một số cảnh báo

public class AetherViewDataDictionary : ViewDataDictionary 
{ 
    public AetherViewDataDictionary() 
    { 
     ModelStateWarning = new ModelStateDictionary(); 
    } 

    public AetherViewDataDictionary(object model) : base(model) 
    { 
     ModelStateWarning = new ModelStateDictionary(); 
    } 

    public AetherViewDataDictionary(ViewDataDictionary viewDataDictionary) : base(viewDataDictionary) 
    { 
     ModelStateWarning = new ModelStateDictionary(); 
    } 

    public ModelStateDictionary ModelStateWarning { get; private set; } 
} 

Vấn đề mà tôi đang gặp bây giờ là khi tôi nhận được mã quan điểm của tôi, điều này chỉ là để gỡ lỗi Tôi đang mất thực tế là loại mới của tôi, vì vậy khi tôi cố gắng truyền lại và truy cập vào từ điển mới của tôi, tôi không có niềm vui.

public partial class Index : ViewPage<PageViewData> 
{ 
    protected override void SetViewData(ViewDataDictionary viewData) 
    { 
     base.SetViewData(viewData); 
    } 
} 

Nó đặt chính xác ở đây, nhưng khi tôi kiểm tra loại nó đã biến mất.

Chỉnh sửa: Điều này hóa ra lại là một cách làm câm lặng, xem câu trả lời bên dưới.

Trả lời

6

Vì vậy, tuyến đường mà tôi đã đi xuống trước khi hóa ra là một ý tưởng tồi, không có đủ quyền truy cập trong khuôn khổ để nhận các bit bạn cần. Ít nhất là không phải không phát minh lại bánh xe một vài lần.

tôi quyết định đi xuống con đường mở rộng lớp ModelState để thêm một bộ sưu tập các cảnh báo với nó:

public class AetherModelState : ModelState 
{ 
    public AetherModelState() { } 

    public AetherModelState(ModelState state) 
    { 
     this.AttemptedValue = state.AttemptedValue; 

     foreach (var error in state.Errors) 
      this.Errors.Add(error); 
    } 

    private ModelErrorCollection _warnings = new ModelErrorCollection(); 

    public ModelErrorCollection Warnings { get { return this._warnings; } } 
} 

Để có thể dễ dàng thêm cảnh báo trong cùng một cách mà bạn sẽ lỗi tôi đã tạo một số phương pháp mở rộng cho ModelStateDictionary:

public static class ModelStateDictionaryExtensions 
{ 
    public static void AddModelWarning(this ModelStateDictionary msd, string key, Exception exception) 
    { 
     GetModelStateForKey(key, msd).Warnings.Add(exception); 
    } 

    public static void AddModelWarning(this ModelStateDictionary msd, string key, string errorMessage) 
    { 
     GetModelStateForKey(key, msd).Warnings.Add(errorMessage); 
    } 

    private static AetherModelState GetModelStateForKey(string key, ModelStateDictionary msd) 
    { 
     ModelState state; 
     if (string.IsNullOrEmpty(key)) 
      throw new ArgumentException("key"); 

     if (!msd.TryGetValue(key, out state)) 
     { 
      msd[key] = state = new AetherModelState(); 
     } 

     if (!(state is AetherModelState)) 
     { 
      msd.Remove(key); 
      msd[key] = state = new AetherModelState(state); 
     } 

     return state as AetherModelState; 
    } 

    public static bool HasWarnings(this ModelStateDictionary msd) 
    { 
     return msd.Values.Any<ModelState>(delegate(ModelState modelState) 
     { 
      var aState = modelState as AetherModelState; 
      if (aState == null) return true; 
      return (aState.Warnings.Count == 0); 
     }); 
    } 
} 

Mã GetModelStateForKey là ropey nhưng bạn sẽ có thể thấy nơi tôi đang đứng đầu với điều này. Điều tiếp theo cần làm là viết một số phương pháp mở rộng cho phép tôi hiển thị cảnh báo cùng với các lỗi

+0

TryedValue là gì? –

+0

Ngoài ra "if (aState == null) trả về true;" dòng không đúng. Chúng ta nên trả về true nếu và chỉ khi bộ sưu tập có liên quan có ít nhất một mục. Vì vậy, bạn nên loại bỏ dòng này và thay đổi dòng tiếp theo thành "return (aState! = Null && aState.Warnings.Count> 0);" –

4

Tại sao không chỉ cần thêm danh sách cảnh báo hoặc từ điển vào ViewData và sau đó hiển thị chúng trong chế độ xem của bạn?

ví dụ:

ViewData[ "warnings" ] = new[] { "You need to snarfle your aardvark" } ; 
Các vấn đề liên quan