سؤال

تحديث مهم
منذ إصدار MVC 2.0 معاينة 1 هذه الميزة قد تم تنفيذ جزء من الفعلية إطار نفسها في شكل من المجالات.المزيد من التفاصيل متوفرة على فيل Haack بلوق هنا

لدي جهاز تحكم يسمى ListManagerController.هذا تحكم تحتوي على ActionResult طريقة تسمى مؤشر().عندما أنا على حق انقر على المؤشر في Visual Studio وحدد إضافة عرض عرض جديد تم إنشاؤه في /آراء/ListManager/مؤشر.

ومع ذلك أريد مؤشر عرض كافة طرق العرض التالية التي سيتم إنشاؤها في /آراء/إدارة/ListManager/.كيف يمكنني تحقيق ذلك ؟

تحرير:وأشير إلى أن هذا السؤال هو نسخة مكررة من السؤال نشرها هنا.يبدو لي مهارات البحث فشلت في البداية.

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

المحلول

موقع الآراء مرتبطة ViewFactory تستخدمه.AFAIK "نماذج ويب" عرض محركات لا يدعم المناطق [إدارة في المثال الخاص بك].

شرارة يدعم هذا و نظيفة جدا, كما يمكنك مزيج المباراة "نماذج ويب" و شرارة وجهات النظر حتى لا تضطر إلى إعادة جميع وجهات النظر الخاصة بك.

تحديث: يبدو فيل Haack لديه بلوق وظيفة حول كيفية تحقيق ذلك.رمز له هو RC, ولكن أعتقد أنه يجب أن تجمع غرامة ضد ASP.NET MVC RTM.

نصائح أخرى

أعلم أنك قبلت بالفعل إجابة ولكن هنا ما خطرت في حين أن تجارب مع نفس الفكرة مع مساعدة من فيل Haack بعد.

أولا يجب أن يكون لديك الخاصة بك ViewEngine للبحث عن المجلدات ضمن عرض المجلد.شيء من هذا القبيل :(ستلاحظ أن يبدو الكثير مثل فيل Haack مناطق رمز)

public class TestViewEngine : WebFormViewEngine
{
    public TestViewEngine()
        : base()
    {
        MasterLocationFormats = new[] {
            "~/Views/{1}/{0}.master",
            "~/Views/Shared/{0}.master"
        };

        ViewLocationFormats = new[] {
            "~/{0}.aspx",
            "~/{0}.ascx",
            "~/Views/{1}/{0}.aspx",
            "~/Views/{1}/{0}.ascx",
            "~/Views/Shared/{0}.aspx",
            "~/Views/Shared/{0}.ascx"
        };

        PartialViewLocationFormats = ViewLocationFormats;
    }
    public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
        ViewEngineResult rootResult = null;

        //if the route data has a root value defined when mapping routes in global.asax
        if (controllerContext.RouteData.Values.ContainsKey("root")) {
            //then try to find the view in the folder name defined in that route
            string rootViewName = FormatViewName(controllerContext, viewName);
            rootResult = base.FindView(controllerContext, rootViewName, masterName, useCache);
            if (rootResult != null && rootResult.View != null) {
                return rootResult;
            }
            //same if it's a shared view
            string sharedRootViewName = FormatSharedViewName(controllerContext, viewName);
            rootResult = base.FindView(controllerContext, sharedRootViewName, masterName, useCache);
            if (rootResult != null && rootResult.View != null) {
                return rootResult;
            }
        }
        //if not let the base handle it
        return base.FindView(controllerContext, viewName, masterName, useCache);
    }

    private static string FormatViewName(ControllerContext controllerContext, string viewName) {
        string controllerName = controllerContext.RouteData.GetRequiredString("controller");

        string root = controllerContext.RouteData.Values["root"].ToString();
        return "Views/" + root + "/" + controllerName + "/" + viewName;
    }

    private static string FormatSharedViewName(ControllerContext controllerContext, string viewName) {
        string root = controllerContext.RouteData.Values["root"].ToString();
        return "Views/" + root + "/Shared/" + viewName;
    }
}

ثم في Global.asax استبدال الافتراضي ViewEngine مع مخصص واحد ، Application_Start :

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new TestViewEngine());

الآن عندما تقوم بتعريف الطرق في Global.asax, تحتاج إلى تعيين root القيمة مشيرا إلى المجلد للبحث عن إطار عرض المجلدات مثل ذلك :

routes.MapRoute(
    "ListManager",
    "ListManager/{action}/{id}",
    new { controller = "ListManager", action = "Index", id = "", root = "Manage" }
 );

هذا السؤال كثيرا تكرار هذا السؤال

لذلك سوف اقتبس ردي على هذا واحد هنا.

خطرت لي حل آخر التي لا تتطلب مني أن لفة بلدي عرض المحرك.

في الأساس, أردت أن تبقي كما MVC "الاتفاقية" مدفوعة ممكن, ولكن أنا لا يزال يرغب في تنظيم كل من بلدي "الادارة" وجهات النظر تحت ~/آراء/المشرف المجلد.

على سبيل المثال:

  • ~/آراء/المشرف/User/
  • ~/آراء/المشرف/News/
  • ~/آراء/Admin/مدونة/

الحل هو إنشاء قاعدة جديدة فئة محددة بلدي المشرف تحكم و "القوة" الطريق إلى يرى أن تحكم.

لدي بلوق وظيفة نموذج التعليمات البرمجية هنا: تنظيم وجهات النظر في ASP.Net MVC

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