سؤال

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

بقدر ما أشعر بالقلق من أنها نفس الشيء الذي تم استدعاء إجراء. أنا في الأساس يمر على مستوى آخر (هناك سبب وجيه لا يمكنني الحصول على هذه الأساليب على وحدة تحكم BTW).

قمت بتنزيل مصدر ASP.NET MVC 1.0 ولكن هناك مجموعة من الفصول، أواجه مشكلة في العثور على التعليمات البرمجية التي تعالج هذا.

أعرف كيفية استدعاء طريقة يتم احتواء اسمها في سلسلة، ولكن ربما هناك طريقة أفضل لاستخدام MVC. أحتاج أيضا إلى معرفة كيفية استخدام المجلدات النموذجية لتقديم الطلب .form + سلاسل الاستعلام إلى معلمات تلك الأساليب.

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

اسمحوا لي أن أعرف إذا كان بإمكاني جعل هذا أكثر وضوحا.

شكرًا

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

المحلول

انه لامر معقد. يتم استدعاء الاعلان على جهاز التحكم في التحكم. هذه المكالمات، في نهاية المطاف، excededollerdollerdescriptor.fitegraction، والتي بدورها يستدعي actionmethodelector.findactionmethod، والتي تستدعي runtelectionfilters في نفس النوع. تتخذ هذه الطريقة قائمة بالطرق التي اجتازته من قبل ذوي الياقات البيضاء، وتكرارها، وفحص الحجج الموجودة في كل طريقة ومقارنتها بالقيم في الطلب. نظرا لأن هذا يجب أن يعمل بسرعة بناء على طلب، فهذه كلها مخزنة مؤقتا، ولأنها مصممة لتكون قابلة للتوسيع، هناك بعض أنواع مجردة بين الطبقات التي وصفتها. وبالتالي، قد يكون الأمر صعبا بعض الشيء في البداية، ومن المحتمل أن يكون من الصعب إعادة صياغة منطق غير مراقب. ومع ذلك، يمكنك استخدامها كنموذج لتنفيذ نظامك الخاص. أعتقد أنه معقد قليلا جدا للتطبيق الخاص بالمجال. ربما يكون عدد نقاط التمديد مناسبا لإطار MVC، ولكن من أجل الكود الخاص بك، Yagni.

آمل أن يمنحك هذا ما يكفي للبدء.

فيما يتعلق باستخدام Binder نموذج بدون كومة الويب: حسنا، لا تزال بحاجة إلى MVC، ولكن ليس بالضرورة خادم ويب. إليك كيفية القيام بذلك في اختبار الوحدة:

    internal static T Bind<T>(string prefix, FormCollection collection, ModelStateDictionary modelState) where T:BaseTimeRecordPresentationModel
    {
        var mbc = new ModelBindingContext()
        {
            ModelName = prefix,
            ModelState = modelState,
            ModelType = typeof(T),
            ValueProvider = collection.ToValueProvider()
        };
        IModelBinder binder = new TimeRecordModelBinder();
        var cc = new ControllerContext();

        return binder.BindModel(cc, mbc) as T;
    }

    internal static T BindAndAssertValid<T>(string prefix, FormCollection collection) where T:BaseTimeRecordPresentationModel
    {
        var msd = new ModelStateDictionary();
        var result = Bind<T>(prefix, collection, msd);
        if (!msd.IsValid)
        {
            Assert.Fail(ModelStateValidationSummary(msd));
        }
        return result;
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top