2010-11-10 53 views
8

Trong ứng dụng của tôi, tôi đang cố gắng phân tách trường Ngày và Giờ từ và DateTime để tôi có thể đặt bộ chọn ngày jQuery vào ngày đó. Tôi đã tìm thấy Hanselman's code for splitting the DateTime, tuy nhiên tôi nhận được lỗi biên dịch trên bindingContext.ValueProvider.TryGetValue(modelName, out valueResult);. Lỗi tôi nhận được là:ValueProvider không chứa định nghĩa cho TryGetValue

Lỗi 3 'System.Web.Mvc.IValueProvider' không chứa định nghĩa 'TryGetValue' và không có phương pháp mở rộng 'TryGetValue' chấp nhận đối số đầu tiên của loại 'System.Web. Mvc.IValueProvider 'có thể được tìm thấy (bạn đang thiếu một chỉ thị bằng cách sử dụng hoặc một tham chiếu lắp ráp?) C: \ Documents and Settings \ xxx \ My Documents \ Visual Studio 2008 \ Dự án \ MyProject \ Project \ Helpers \ DateAndTimeModelBinder.cs 83 42 Dự án

Tôi thiếu gì đó? Tôi đã tạo một lớp mới và đặt mã của mình trong một thư mục Helpers trong dự án của tôi.

+0

chúng ta có thể thay đổi tiêu đề để chính xác hơn không? 'IValueProvider không chứa định nghĩa cho TryGetValue' hay gì đó? Tôi có thể thay đổi nó không? Sẽ giúp những người khác tìm câu hỏi của bạn một cách chính xác. – jcolebrand

+0

Tôi đã thay đổi điều đó. –

Trả lời

14

TryGetValue() không phải là thành viên của System.Web.Mvc.IValueProvider. tôi nghi ngờ anh ấy có một phần mở rộng tùy chỉnh mà trông giống như sau:

public static bool TryGetValue(this IValueProvider valueProvider, string key, out ValueProviderResult result) { 
    try { 
     result = valueProvider.GetValue(key); 
     return true; 
    } 
    catch { 
     result = null; 
     return false; 
    } 
} 

Cập nhật

TryGetValue() không phải là một phương pháp khuyến nông, nhưng đúng hơn đó là một phương pháp vào loại IDictionary <T,U>. Loại bindingContext.ValueProvider đã thay đổi kể từ MVC1 dưới dạng @mootinator được chỉ định. Có thể bạn chỉ cần bỏ qua cuộc gọi đến TryGetValue() và thay vào đó gọi số GetValue() và kiểm tra kết quả cho giá trị rỗng. Tôi không chắc chắn nếu nó sẽ ném một ngoại lệ như tôi đã không thử nghiệm nó, vì vậy hãy thử điều đó đầu tiên.

+4

Xác nhận rằng phương thức GetValue() mới sẽ trả về null nếu khóa không được tìm thấy trong ngữ cảnh ràng buộc, do đó, việc thử/bắt không cần thiết. –

5

Tôi đã gặp sự cố này khi cố gắng làm theo ví dụ của Hanselman vào ngày khác. Nó không phải là một ví dụ MVC2. TryGetValue không hoạt động và/hoặc không cần thiết nữa. Hãy thử liên kết này:

http://forums.asp.net/p/1529895/3706154.aspx

Tôi tạo ra một phương pháp khuyến nông MVC2 từ phương pháp geta Hanselman để thay thế, mặc dù tôi không chắc liệu nó hoạt động như mong muốn, vì nó không giải quyết vấn đề độc đáo của tôi, mà didn 't thực sự có bất cứ điều gì để làm với ngày tháng hoặc thời gian.

public static T? GetA<T>(this ModelBindingContext bindingContext, string key) where T : struct 
     { 
      T? valueResult = null; 
      if (String.IsNullOrEmpty(key)) return null; 
      //Try it with the prefix... 
      try 
      { 
       valueResult = (T?)bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "." + key).ConvertTo(typeof (T)); 
      } catch (NullReferenceException){} 
      //Didn't work? Try without the prefix if needed... 
      if (valueResult == null && bindingContext.FallbackToEmptyPrefix == true) 
      { 
       try 
       { 
        valueResult = (T?) bindingContext.ValueProvider.GetValue(key).ConvertTo(typeof (T)); 
       } catch (NullReferenceException){} 
      } 
      return valueResult; 
     } 
    } 
Các vấn đề liên quan