2009-11-04 3 views
21

Tôi đang gặp nhiều khó khăn khi cố gắng gỡ lỗi tại sao MVC không ràng buộc chính xác trong một trường hợp cụ thể mà tôi có ...ASP.net MVC v2 - Gỡ lỗi các vấn đề về ràng buộc mô hình - BUG?

Về cơ bản, tôi có một hành động phức tạp mà lần lượt có một đứa trẻ phức tạp object - Activity.Location.State (Trường hợp Activity là đối tượng phức tạp mà hành động mong đợi, Location là một đối tượng con phức tạp và State chỉ là một chuỗi).

Bây giờ tôi đã thiết lập một dự án thử nghiệm theo như tôi có thể biết chính xác kịch bản thực sự của tôi, trong trường hợp thử nghiệm này, tác vụ ràng buộc ... Nhưng trong dự án thực sự của tôi, Vị trí ... Bằng cách đặt các điểm ngắt trong thuộc tính Locaiton tôi có thể nói rằng MVC đang truy lục đối tượng Vị trí phức tạp từ Hoạt động, nhưng không đặt bất kỳ thuộc tính nào ... HOẶC không đặt bất kỳ thuộc tính nào ...

Tôi đang cố gắng gỡ lỗi vấn đề nhưng Tôi cần truy cập vào các biểu tượng 2 bản xem trước MVC v2 mà tôi dường như không thể theo dõi ... Tôi muốn xem nó thực sự làm gì khi nó kéo ra đối tượng vị trí (vì một lý do nào đó tôi nghĩ rằng nó có thể bị lỗi nội bộ nhưng nuốt ngoại lệ).

Bất kỳ ý tưởng về những gì tôi có thể làm ở đây ...

Cheers Anthony

UPDATE:

Ok tôi đã làm những gì J.W. đề xuất và tham khảo trực tiếp dự án MVC ...

Tôi đã tìm thấy sự cố và có một sự khác biệt rất nhỏ mà tôi bỏ qua ... Như tôi thấy, MVC hiện không hỗ trợ nhiều cấp độ thừa kế INTERFACE khi nó đi kèm để mô hình ràng buộc ... Xem sau ...

//MODEL 
public class Location : ILocation 
{ 
    ... 
} 

public interface ILocation : ILocationCore 
{ 
    ... 
} 

public interface ILocationCore //In my sample I didn't have this second level interface 
{ 
    ... 
    //MVC doesn't find any of these properties 
    ... 
} 


public class Activity : IActivity 
{ 
    ... 
} 

public interface IActivity : IActivityCore 
{ 
    ILocation Location { get; set; } //MVC finds this and reads its meta type as an ILocation 
    //Also the implementation of this Location within Activity will always return a instance - our IoC takes care of that, so MVC should never have to create the instance 
} 

public interface IActivityCore 
{ 
    ... 
} 

//CONTROLLER 
public ActionResult Create(Activity activity) 
{ 
} 

Do đó những gì tôi đã thấy là MVC tìm Vị trí và đọc loại meta của nó như là một ILocation, nhưng khi GetModelProperties được chạy trong DefaultModelBinder sau xảy ra -

protected virtual PropertyDescriptorCollection GetModelProperties(ControllerContext controllerContext, ModelBindingContext bindingContext) { 
     return GetTypeDescriptor(controllerContext, bindingContext).GetProperties(); 
     //This return no properties 
    } 

    protected virtual ICustomTypeDescriptor GetTypeDescriptor(ControllerContext controllerContext, ModelBindingContext bindingContext) { 
     return new AssociatedMetadataTypeTypeDescriptionProvider(bindingContext.ModelType).GetTypeDescriptor(bindingContext.ModelType); 
     //bindingContext.ModelType - is ILocation 
    } 

Do đó tôi giả định vào thời điểm này TypeDescriptionProvider không hỗ trợ kiểu thừa kế này, điều mà tôi khá ngạc nhiên. Ngoài ra nhìn vào nguồn v1 nó trông như thế này đã được giới thiệu với v2 - nhưng v1 có thể không có thể hỗ trợ những gì tôi đang cố gắng làm anyway.

Tôi sẽ không nói rằng đây thực sự là lỗi, nhưng tôi đã thử thay thế giao diện của mình bằng các lớp cụ thể và nó hoạt động tốt. Do đó hành vi không thực sự là những gì tôi mong đợi và có một chút không nhất quán.

Bất kỳ suy nghĩ nào ??? Tôi đã nghĩ rằng sự thừa kế này không phải là tiêu chuẩn khá nhưng sẽ xảy ra thường xuyên đủ để được phục vụ. Cảm ơn vi đa trả lơi.

Chúc mừng

+0

Giao diện không thể kế thừa, chỉ có các lớp học có thể. Giao diện xác định các yêu cầu thực hiện. Nếu bạn nói IFoo: IBar, bạn đang nói trình biên dịch "Bất kỳ lớp nào triển khai giao diện IFoo cũng phải triển khai giao diện IBar". – ScottKoon

Trả lời

45

Tắt hành vi này là do thiết kế do cách thức hoạt động của giao diện. Giao diện không xác định việc triển khai, do đó ILocation không "kế thừa" các thuộc tính của ILocationSource.Thay vào đó, ILocation chỉ định nghĩa việc triển khai thực hiện cụ thể nào.

Đối với đầy đủ các chi tiết bao gồm các phần của CLI (Common Language Infrastructure) spec trong đó xác định hành vi này, hãy kiểm tra: http://haacked.com/archive/2009/11/10/interface-inheritance-esoterica.aspx

+0

Tôi nghĩ rằng bình luận của Brad Wilson là cách tôi luôn nhớ sự khác biệt và mong đợi hành vi thích hợp. "Có thể làm vs là" –

+0

Có - trên thực tế .NET luôn thiếu nhiều thừa kế - nhiều đến sự thất vọng của nhiều nhà phát triển C++ đến nền tảng này. Tôi khuyên bạn nên có một cái nhìn tổng quan đầy đủ về Thiết kế hướng đối tượng, và sau đó đọc một cuốn sách hay về C#. Các poster ban đầu rõ ràng đang cố gắng để chạy trước khi họ có thể đi bộ, bằng cách phát triển trên MVC trước khi họ hoàn toàn hiểu C#. Tôi nói đây là một sai lầm và sẽ dẫn đến nhiều thất vọng. – csharpforevermore

3

Tôi chỉ đơn giản là tham chiếu đến mã nguồn mvc2 asp.net được xuất bản trong codeplex. Tôi đã làm điều đó, nó rất đơn giản.

Nó sẽ giúp bạn hiểu rõ hơn khi bạn gỡ lỗi thông qua mã nguồn.