2015-09-14 14 views
7

Na ASP.NET MVC 5 użyłem ViewPage zasady z kilku właściwości:bazowa Zobacz strony w ASP.NET MVC 6

public String PageTitle { get; set; } 
public String PageDescription { get; set; } 
public String[] BodyCssClasses { get; set; } 

Następnie na każdym widoku musiałbym:

@{ 
    PageTitle = "Title ..." 
    PageDescription" = "Description ..." 
    BodyCssClasses = new String[] { "main", "home" } 
} 

na stronie głównej chciałbym po prostu użyć czegoś takiego:

<title>@Title</title> 

Dzięki takiemu podejściu udało mi się wykorzystać Strong wpisane do właściwości strony ...

Czy można używać strony widoku podstawowego w ASP.NET MVC 6?

Ponieważ nie ma Web.Config, jak to zrobić?

Wszelkie sugestie dotyczące lepszych opcji definiowania informacji o stronie są mile widziane.

UPDATE

śledziłem sugerowane i używam:

public abstract class ViewPageBase<TModel> : RazorPage<TModel> { 
    public String Title { get; set; } 
} // ViewPageBase 

Następnie na _ViewImports mam:

@inherits ViewPageBase<TModel> 

Na _Layout.cshtml mam:

<title>@Title</title> 

I wreszcie na widoku, który wykorzystuje układ, że mam:

@{ 
    Title = "Page Title"; 
    Layout = "_Layout"; 
} 

Wszystko kompiluje się i działa, ale tytuł strony jest zawsze pusty.

Czy ktoś ma jakiś pomysł, dlaczego?

+0

FYI - W rzeczywistości istnieje plik web.config w folderze 'wwwroot'. Nie sądzę jednak, że możesz go użyć do skonfigurowania strony widoku podstawowego, tak jak przedtem. O ile mogę powiedzieć, to ściśle skonfigurować IIS. – NightOwl888

+0

Tak, to właśnie znalazłem. Byłoby miło, gdyby Stiller mógł ustawić tytuł i inne właściwości strony bez korzystania z widoku widoku lub modelu widoku. –

+0

Wiem, że to brzmi szalenie, co się stanie, jeśli po prostu zmienisz nazwę zmiennej/własności "Tytuł" na cokolwiek innego? –

Odpowiedz

1

Wygląda na to, że szukasz dyrektywy maszynowej @inherits.

Na przykład:

@inherits MyBaseViewPage

+0

Proszę zobaczyć aktualizację, którą dodałem do mojego pytania ... Zastanawiam się, dlaczego to nie działa. –

+1

Wygląda na to, że jest to błąd w MVC/Razor. Hah, zdecydowanie powinno działać :) –

+0

Uwaga: Zostało to naprawione w nadchodzącym wydaniu beta8. –

3

Prawdopodobnie będziesz chciał uczynić swoją bazę widok stronie będą dziedziczyć z RazorPage.

public abstract class ViewPageBase<TModel> : RazorPage<TModel> 
{ 
} 

Następnie powinieneś być w stanie skonfigurować wszystkie swoje strony do dziedziczą od tego w pliku _ViewImports.cshtml.

@inherits ViewPageBase<TModel> 

UPDATE

Nie wiem, czy jest to najlepsze podejście, ale zastanawiam się, czy można korzystać ze wspólnej ViewBag do współdzielenia danych między swoim widokiem i układ.

Powrót właściwości w swojej klasie widoku baza z ViewBag:

public abstract class ViewPageBase<TModel> : RazorPage<TModel> 
{ 
    public string Title 
    { 
     get { return ViewBag.Title; } 
     set { ViewBag.Title = value; } 
    } 
} 

Ustaw właściwość w widoku:

@{ 
    Title = "Home Page"; 
} 

korzystać z nieruchomości w _Layout.cshtml:

<title>@Title</title> 
+0

Podążyłem za twoim podejściem, ale nie ustawiłem właściwości, którą ustawiłem. Właśnie dodałem aktualizację do mojego pytania. Czy masz pojęcie, dlaczego tak się dzieje? –

+0

Myślę, że problem polega na tym, że tworzone są dwa oddzielne wystąpienia twojej klasy strony - jedna dla widoku i jedna dla layoutu - więc własność, którą ustawisz w jednym, nie jest dostępna w drugiej. Zaktualizowałem moją odpowiedź obejściem, które korzysta ze współużytkowanej ViewBag. – Peter

+0

Z ciekawości, czy to podejście działało w MVC5 - ustawianie właściwości w widoku i uzyskiwanie dostępu do nich na stronie układu/strony głównej? Nie miałem okazji go przetestować ... – Peter

1

Technika, którą opisałeś w swojej aktualizacji, sprawdzi się technicznie.

Niestety, jak zauważa @Peter, otrzymuje się jedną instancję niestandardowej strony ViewPage dla widoku i inną instancję dla układu. Ponieważ używasz dwóch różnych instancji, nie możesz ustawić właściwości w widoku i oczekiwać dostępu do tej właściwości w układzie. To odpowiedź na zaktualizowanym pytanie:

Wszystko kompiluje i działa ale tytuł strony jest zawsze pusty. Czy ktokolwiek ma jakiś pomysł, dlaczego ktoś ma ?

@Peter zaoferował pracę przy użyciu ViewBag. Chciałbym zaoferować dodatkowe obejście za pomocą wtrysku zależności.

Na przykład, należy rozważyć umieszczenie swoich właściwości niestandardowych w ich własnej klasy, z własnym interfejsem:

public IPageMetaData { 
    string PageTitle { get; set; } 
    string PageDescription { get; set; } 
    string[] BodyCssClasses { get; set; } 
} 

public PageMetaData : IPageMetaData { 
    public string PageTitle { get; set; } 
    public string PageDescription { get; set; } 
    public string[] BodyCssClasses { get; set; } 
} 

Teraz zarejestrować to z ram iniekcji zależność .Net podstawowej. Użyj cyklu życia Scoped, więc tylko jedna instancja zostanie utworzona na żądanie internetowe. W projekcie waniliowym, odbywa się to w Startup.cs w sposobie ConfigureServices:

public void ConfigureServices(IServiceCollection services) { 
    // Add framework services. 
    services.AddMvc(); 
    services.AddScoped<IPageMetaData, PageMetaData>(); 
} 

Wreszcie, należy zaktualizować plik _ViewImports.cshtml wstrzyknąć ten przedmiot w widokach:

@inject Your.Namespace.Goes.Here.IPageMetaData MetaData; 

Teraz twoje poglądy będą miały ambient MetaData Właściwość, która będzie odpowiadać instancji żądania w Internecie klasy PageMetaData. Możesz uzyskać do niego dostęp zarówno z widoków, jak i układu:

@{ 
    // In a view 
    MetaData.PageTitle = "Set a page title"; 
} 

@* In a layout *@ 
<title>@MetaData.PageTitle</title> 
Powiązane problemy