كيفية تعيين تخطيط الحلاقة في MVC عبر مرشح السمة؟
-
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
.