2011-07-05 15 views
29

私の/ Viewsフォルダにデフォルトの_ViewStart.cshtmlがあります。 ViewBagオブジェクトにアクセスして、すべてのビューのデフォルトのタイトルを設定できるようにしたいと思います。としかし_ViewStart.cshtmlがViewBagオブジェクトにアクセスできないのはなぜですか?

、私が得る

@{ 
    Layout = "~/Views/Shared/SiteLayout.cshtml"; 
    ViewBag.Title = "bytecourse - Online Courses in Technology"; 
} 

ランタイムエラーとして「名前は 『ViewBag』は現在のコンテキストに存在しません」。

何をする必要がありますか?

答えて

40

要するに...コントローラのビューバッグを使用します。

ViewContext.Controller.ViewBag.MyVar = "myVal"; 

@ViewContext.Controller.ViewBag.MyVar 

=================================== http://forums.asp.net/post/4254825.aspx

=======:============================

ここで良い情報があります========================================== ======

一般に、ViewDataを[ "StoreNameを" はまたViewBag.StoreName

と同じである、Controller.ViewData [ "StoreNameを"] = Controller.StoreName = ViewContext.Controller.ViewBag.StoreName = ViewContext.Controller.ViewData ["StoreName"]

しかし、すべてのビューと部分的なビューは、ビューデータの独自のインスタンスを取得します。

http://jeffreypalermo.com/blog/viewdata-mechanics-and-segmentation-excerpt-from-asp.net-mvc-in-action/

======================================= https://stackoverflow.com/a/4834382/291753

==========:========================

ここで別の解決策があります========================================== ===

2

あなたはデフォルトのタイトルを設定したい場合は、あなたの_layoutのセクションを使用することができます。

<title> 
    @if (IsSectionDefined("Title")) 
    { 
     @RenderSection("Title") 
    } 
    else 
    { 
     @:bytecourse - Online Courses in Technology 
    } 
</title> 

と内側の景色をあなたがそれをオーバーライドすることができます:

@section Title { 
    Overriden title 
} 

ViewBagを使用しないもう一つの理由: - )

+1

@Darin Dimitrovは使用されていません@RenderSection( "Title") 'が使用されています@RenderSection(" Title "、required:= false)'の場合、必要条件がありますかIsSectionDefined ( "タイトル")? –

+0

@BeratBilginこのセクションがビューで定義されていない場合は、デフォルト値を使用するかどうかによって異なります。 –

3

hmmのように、ViewData経由でViewBagにアクセスすることができます。 ViewContext.ViewData["Title"]

たとえば、アクションフィルタでViewBagデータを設定した場合は、ViewContext.ViewData["Title"]を使用して_ViewStart.cshtmlから引き出すことができます。

しかし、ViewContext.ViewData["Key"] = value;を使用して値を割り当てようとしましたが、実際のビューには反映されません。

2

部分ビューを使用してこれを実現できます。タイトルに関連するすべての共通コードを、共有フォルダ内のTitle.cshtmlという部分ビューに置きます。 _viewstartでは、パーシャルビューを呼び出すだけです。

_ViewStart.cshtml

@{ 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 
@Html.Partial("Title") 

〜/共有/ Title.cshtml

@{ 
ViewBag.Title = "bytecourse - Online Courses in Technology"; 
} 
+0

私のmvc5プロジェクトでは、部分ビューからのViewBag値はメインビューからアクセスできません。 ViewDataで同じ問題が発生する 私の一部をレイアウトページに直接レンダリングしても – Alexus1024

0

あなたのViewbagデータを使用している1つのレイアウト・ページを作成して、にレイアウトを追加することができます空白の_ViewStartページが表示されます

on ViewStart.cshtml

@{ 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 
関連する問題