Frage

Ich möchte einen Standard-Razor über Code-Layout einstellen entweder in einem Basis-Controller oder ein Attribut. Es wurde in dem Text & Tabellen erwähnt, dass dies möglich ist, aber ich kann nicht herausfinden, wie es gemacht wird.

Ich weiß, es ist die Masterpage-Parameter auf die View-Methode zur Verfügung, aber ich würde alle Ansichten durch einen Controller diesen Wert zurückgegeben wie automatisch haben.

Und nein, ich kann nicht _ViewStart dafür verwenden, da meine Ansichten in verschiedenen Orten sein werden (dies ist keine normale MVC-Site-Konfiguration).

Danke

War es hilfreich?

Lösung

Ich denke, man könnte nur eine Action wie ...

schreiben
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";
           }
       }
}

Ich schrieb diesen Code durch den Sitz der Hose ohne Compiler so wird es wahrscheinlich nicht kompilieren, aber Sie wahrscheinlich die Idee. Ich denke, IResultFilter ist die richtige Schnittstelle Sie wollen, es Methoden, die direkt ausgeführt werden, bevor die Ansicht gerendert wird. Wenn dies richtig ist, sollten Sie in der Lage sein, den Masternamen für die Ansicht zu ändern, die im Begriff ist, on the fly gemacht werden.

Dies wäre die Controller-Code Nutzung sein.

[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.
   }
}

Andere Tipps

Der einfachste Weg, die ich denken kann, dies zu tun ist durch Ihre Controller aus einer benutzerdefinierten Basisklasse ableiten, die die Überschreibungen View Methode:

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
    }
}

In dem obigen Code könnten Sie den Masternamen bis zu einem gewissen Wert fest codiert explizit festgelegt. Oder Ihr Controller könnte die Methode überschreibt, ein Controller-spezifisches Layout zur Verfügung zu stellen. Oder Sie könnten es von einem Attribut auf dem Controller etwas ähnlich zu lesen:

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

Natürlich müssten Sie Ihre MyCustomAttribute erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top