سؤال

أواجه أكثر من صعوبة صغيرة في محاولة تصحيح سبب عدم ملزم MVC بشكل صحيح في حالة معينة لدي ...

في الأساس، لدي الإجراء الخاص بي الذي يتلقى كائنا معقدا وهو بدوره يحتوي على كائن طفل معقد - Activity.location.state (حيث يكون النشاط هو الكائن المعقد الذي تتوقعه الإجراء، الموقع هو كائن طفل معقد وولاية هو مجرد سلسلة) وبعد

الآن قمت بإعداد مشروع اختبار بقدر ما أستطيع أن أقول بالضبط المخصص بالضبط السيناريو في الواقع لدي، في حالة الاختبار هذه الأعمال الملزمة ... ولكن في مشروعي في الواقع، يعمل الربط في النشاط ولكن ليس في الموقع ... من خلال وضع نقاط استراحة داخل خاصية Lociton، يمكنني معرفة أن MVC يسترجع كائن الموقع المعقيم من النشاط، ولكن لا يقوم بإعداد أي من الخصائص ...

أحاول تصحيح المشكلة لكنني بحاجة إلى الوصول إلى رموز معاينة MVC V2 التي لا يمكنني تعقبها ... أود أن أرى ما يفعله فعلا بمجرد أن يسحب كائن الموقع (للبعض السبب في الاعتقاد بأنه قد يفشل داخليا ولكنه بلع الاستثناء).

أي أفكار حول ما يمكنني القيام به هنا ...

هتاف أنتوني

تحديث:

حسنا، فعلت ما اقترحه JW ورفض مباشرة مشروع MVC ...

لقد وجدت المشكلة وهناك اختلاف صغير للغاية أني أغفلت ... لأنني اكتشفت أن MVC لا يدعم حاليا مستويات متعددة من واجهة الواجهة عندما يتعلق الأمر بالنماذج الملزمة ... شاهد ما يلي ...

//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)
{
}

وبالتالي ما وجدته هو أن MVC يجد الموقع ويقرأ نوع META الخاص به كإعلام، ولكن عند تشغيل GetModelProperties ضمن DefaultModelbinder، يحدث ما يلي -

    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
    }

وبالتالي، أفترض في هذه المرحلة أن TypedescriptionProvider لا يدعم هذا النمط المتمثل في الميراث، وهو ما فوجئت به. انظر أيضا إلى مصدر V1 يبدو وكأنه تم تقديمه مع V2 - لكن V1 قد لم يكن قادرا على دعم ما أحاول القيام به على أي حال.

لن أقول أن هذا هو حقا خطأ، لكنني حاولت استبدال واجهاتي مع فصول ملموسة وعملت بشكل جيد. وبالتالي السلوك ليس حقا ما أتوقعه وهو غير متسق قليلا.

أي أفكار؟؟؟ كنت أعتقد أن هذا الميراث لم يكن معيارا إلى حد ما ولكن سيحدث في كثير من الأحيان بما يكفي ليتم تقديم الطعام ل. شكرا على الرد.

هتافات

هل كانت مفيدة؟

المحلول

اتضح أن هذا السلوك حسب التصميم بسبب كيفية عمل الوراثة الواجهة. لا تحدد الواجهات من التطبيقات، وبالتالي لا "ترث" خصائص ILocationsource. بدلا من ذلك، يحدد ilocation فقط ما يجب تنفيذ التنفيذ الخرساني.

للحصول على التفاصيل الكاملة بما في ذلك قسم CLI (البنية التحتية اللغوية الشائعة) المواصفات التي تحدد هذا السلوك، تحقق من: http://haacked.com/archive/2009/11/10/interface-inheritance-esoterica.aspx.

نصائح أخرى

أود أن أشير ببساطة إلى التعليمات البرمجية المصدر ASP.NET MVC2 المنشورة في Codeplex. فعلت ذلك، انها واضحة جدا.

سوف يمنحك تفهم أفضل بكثير عند تصحيح الأخشاب من خلال التعليمات البرمجية المصدرية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top