سؤال

وأنا محاولة ل impliment وجهة نظر محرك مخصصة لخدمة جهات النظر النقالة بناء على وكيل المستخدم. وأنا أتابع نهج سكوت Hanselman من هذا بلوق وظيفة .

ولقد ورثت من WebFormsViewEngine وتجاوز أسلوب FindView بنفس الطريقة التي يصف سكوت في بلوق له.

وثم قال لي بضعة أسطر إلى بلدي طريقة Global.asax Application_Start لمسح مجموعة محرك عرض وإضافة نسخة جديدة من محرك وجهة نظري.

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

وكيف يمكنني الحصول على بلدي مخصص عرض المحرك للعمل؟ أي مساعدة سوف تكون محل تقدير كبير.

وجهة نظري محرك يبدو مثل هذا:

public class MyViewEngine: WebFormsViewEngine
{
    public override ViewEngineResult FindView (ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
         ViewEngineResult result = null;

         //Serve a special view for iPhones
         if (UserAgentIs(controllerContext, "iPhone"))
         {
              result = base.FindView(controllerContext, "Mobile/iPhone/" + viewName, masterName, useCache);
         }

         //If no special view is found, fall back to the default view
         if (result == null || result.View == null)
         {
              result = base.FindView(controllerContext, viewName, masterName, useCache);
         }

         return result;
    }

    private bool UserAgentIs(ControllerContext controllerContext, string userAgentToTest)
    {
         return (controllerContext.HttpContext.Request.UserAgent.IndexOf(userAgentToTest, StringComparison.OrdinalIgnoreCase) > 0);
    }
}

وفي بلدي Global.asax:

protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new MyViewEngine());
}

عند هذا الإعداد لم تنجح حتى حاولت تبسيط لي طريقة FindView لهذه:

public override ViewEngineResult FindView (ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
         ViewEngineResult result = null;
         result = base.FindView(controllerContext, "Mobile/iPhone/" + viewName, masterName, useCache);
         return result;
    }

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

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

المحلول

وحسنا هذا هو بالتأكيد لاحراج:

وعندما كتبت لي محرك عرض كنت أتابع بلوق وظيفة من سكوت Hanselman (انظر منصبي الأصلي للارتباط). I delcared صفي عرض المحرك ثم قرر أود أن مجرد نسخ ولصق كود سكوت في صفي وتعديل حسب الحاجة. I نسخ عن طريق الخطأ متاحة له مع تعريف الفئة في صفي خلق فئة متداخلة. لذلك بلدي محرك عرض لم يتضمن في الواقع تجاوز للأسلوب FindView وبطبيعة الحال لن يتم استدعاء واحد في فئة متداخلة!

وأما الدرس: عندما باستخدام رمز وجدت على الانترنت لا نسخ ولصق! دائما اكتب بنفسك.

وشكرا لكل من تحقق هذا السؤال من وحاول ان تساعدني.

وسأذهب تقف في زاوية من الخجل والحرج الآن!

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