كيفية تعيين تخطيط الحلاقة في MVC عبر مرشح السمة؟

StackOverflow https://stackoverflow.com/questions/4047810

  •  27-09-2019
  •  | 
  •  

سؤال

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

أعلم أن هناك معلمة MasterPage إلى طريقة العرض المتاحة ، لكنني أود أن يتم إرجاع جميع المشاهدات بواسطة وحدة تحكم هذه المجموعة تلقائيًا.

ولا ، لا يمكنني استخدام _ViewStart لهذا لأن وجهات نظري ستكون في أماكن مختلفة (هذا ليس تكوين موقع MVC عادي).

شكرًا

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

المحلول

أعتقد أنه يمكنك فقط كتابة Actionfilter مثل ...

public class YourCustomLayoutAttribute : ActionFilterAttribute, IResultFilter
{
      public override void OnResultExecuting(ResultExecutingContext filterContext)
      {
           var viewResult = filterContext.Result as ViewResult;
           if(viewResult != null)
           {
              // switch the layout
              // I assume Razor will follow convention and take the "MasterName" property and change the layout based on that.
              viewResult.MasterName = "CustomLayout";
           }
       }
}

لقد كتبت للتو هذا الرمز من مقعد سروالي بدون برنامج مترجم ، لذا ربما لن يتم تجميعه ولكن ربما تحصل على الفكرة. أعتقد أن IresultFilter هي الواجهة الصحيحة التي تريدها ، فهي تحتوي على طرق تنفذها قبل تقديم العرض مباشرة. إذا كان هذا صحيحًا ، فيجب أن تكون قادرًا على تعديل اسم MasterName للعرض الذي على وشك تقديمه أثناء الطيران.

سيكون هذا استخدام رمز وحدة التحكم.

[YourCustomLayout] // this should trigger your custom action result for all actions
public class MyController : Controller
{
   public ActionResult Index()
   {
      return View("Index", "MainLayout"); // even if you were to use the overload to set a master, the action result should override it as it executes later in the pipeline.
   }
}

نصائح أخرى

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

public class MyControllerBase : Controller {
    public override ViewResult View(string viewName, string masterName, object model) {
        if(String.IsNullOrEmpty(masterName)) {
            masterName = GetDefaultLayout();
        }
        base.View(viewName, masterName, model);
    }

    public virtual string GetDefaultLayout() {
        return // your default layout here
    }
}

في الكود أعلاه ، يمكنك ضبط اسم MasterName بشكل صريح على بعض القيمة المتشددين. أو يمكن أن تتجاوز وحدات التحكم طريقة لتوفير تخطيط خاص بالتحكم. أو يمكنك قراءتها من بعض السمات على وحدة التحكم ، وهو شيء مماثل لـ:

masterName = GetType().GetCustomAttributes().
             OfType<MyCustomAttribute>().FirstOrDefault().DefaultLayoutPage;

بالطبع عليك إنشاء الخاص بك MyCustomAttribute.

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