2014-09-09 13 views
4

В MVC 5, я могу установить класс по умолчанию базового и usings для всех видов в «Views/Web.Config»:Как установить макет, базовый класс и использование для всех видов?

<system.web.webPages.razor> 
    <pages pageBaseType="SomeCustomPageClass"> 
    <namespaces> 
     <add namespace="SomeNamespace" /> 

Я также установить раскладку по умолчанию для всех представлений в «_ViewStart.cshtml» :

@{ Layout = "~/Views/Shared/SomeCustomLayout.cshtml"; } 

Как я могу сделать это в MVC 6?

ответ

4

Как сообщалось, in this github issue в CTP3 нет способа сделать это через конфигурацию. Однако вы можете заменить MvcRazorHost по умолчанию с пользовательской один:

public abstract class MyPage<T> : RazorPage<T> 
{/*...*/} 

public abstract class MyPage : RazorPage 
{/*...*/} 

public class MvcMyHost : MvcRazorHost 
{ 
    public MvcMyHost() : base(typeof(MyPage).FullName) { } 
} 

public class Startup 
{ 
    public void Configure(IBuilder app) 
    { 
     var configuration = new Configuration(); 
     configuration.AddJsonFile("config.json"); 
     configuration.AddEnvironmentVariables(); 

     app.UseServices(services => 
     { 
      services.AddMvc(configuration); 
      services.AddTransient<IMvcRazorHost, MvcMyHost>(); 
     }); 
     // etc... 
    } 
} 

К сожалению, вы не получите IntelliSense с этим подходом, поскольку редактор всегда использует исходный класс MvcRazorHost.

В alpha4 из vNext все, что вы просили (страницы базового типа с помощью - @inherits директивы, usings, макет) будет поддерживаться через _ViewStart.cshtml, как обсуждалось here.

+0

То же самое для usings и '_ViewStart'? –

+0

@ ŞafakGür просто поместите файл _ViewStart.cshtml в папку/Views и добавьте директиву макета. Я попробовал это в CTP3 webapp по умолчанию, удалив все this.Layout = "..." директивы из представлений и, похоже, сработает. – m0sa

+0

Обратите внимание, что многие причины, чтобы заменить базовый класс (например, добавить свойства, изменить HtmlHelper и т. Д.), Теперь не нужны в новой директиве @inject. Вы можете ввести услугу на свою страницу, а Razor будет генерировать свойство, которое заменяет исходное свойство, или добавляет новый. –

0

от 2017-1-14, документация по Razor Directives говорит, что это поддерживается:

директива @inherits дает вам полный контроль над классом вашей страницы Razor наследуется

@inherits TypeNameOfClassToInheritFrom 

Например, предположим, что у нас был следующий тип страницы Razor:

using Microsoft.AspNetCore.Mvc.Razor; 

public abstract class CustomRazorPage<TModel> : RazorPage<TModel> 
{ 
    public string CustomText { get; } = "Hello World."; 
} 

Следующая Бритва будет генерировать <div>Custom text: Hello World</div>.

@inherits CustomRazorPage<TModel> 

<div>Custom text: @CustomText</div> 

 Смежные вопросы

  • Нет связанных вопросов^_^