2011-08-01 6 views
1

HomeControllerのIndexアクションに次のコードがあり、レイアウトの下にコードがあります。ホーム/インデックスビューを呼び出すと、UserNameプロパティは設定されていませんが、ブレークポイントの値を調べると、コントローラに設定されていることがわかります。自分のビューでViewBag設定を使用できないのはなぜですか?

コントローラー:

public ActionResult Index() 
{ 
    ViewData.Add("UserName", User.Identity.Name); 
    return View(); 
} 

ビュー:

@{ 
    if (User.Identity.IsAuthenticated) 
    { 
    <text>Hello </text> 
    @ViewBag.UserName <text> - </text> 
    @Html.ActionLink("Sign Out", "LogOff", "Account", null, new { style = "font-weight: bold;" }) 
    } 
} 

EDIT:以下の回答で提案されているように、私は、次のビューのコードをしようとすると、私はコンパイルエラーを取得します:'System.Web.Mvc.HtmlHelper'に 'Display'という名前の適用可能なメソッドはありませんが、そのnaで拡張メソッドがあるようです私。

これは私のネストされたレイアウトの副作用ではないのだろうか?引用されたビューのレイアウトは_ThreeColumnで、後者のレイアウトは_Layoutで、_ViewStartでデフォルトとして設定されています。

+0

であるように製造したHTMLビューのUser.Identity.Nameも? –

+0

@Mika、私はビューで 'User.Identity.Name'を使い始めました。そして、それが現れていないときにデバッグするために追加されたものを追加しました。 – ProfK

+0

Hello @ User.Identity.name - @ Html.ActionLink(...)をやってみましたか? –

答えて

4

まず、コントローラとビューの両方で常にビューバックまたはビューデータを使用する必要があります。これは、コードをわかりやすくするためです。

public ActionResult Index() 
{ 
    ViewBag.Username = User.Identity.Name; 
    return View(); 
} 

実際の問題は@Html.Displayにあります。もう一度@記号を入力する必要はありません。これは次のようにする必要があります:かみそりビューで

@ViewBag.UserName <text> - </text> 
+1

ViewBagはViewData辞書の動的アクセッサではありませんか? – StriplingWarrior

+0

いいえ、良い点、問題は@ Html.Displayコードだけにあるためです。 –

+0

@記号を削除した編集をご覧ください。 – ProfK

3

また、あなたが(コントローラ内部)より読みやすくするために、以下に行うことができます@ViewBag.UserName

に変更@Html.Display("@ViewBag.UserName")

ViewBag.UserName= User.Identity.Name; 

@variablenameが自動的に生成しますhtmlエンコードされたテキストこんにちは<b>Praveen!!</b>

---A razor view start--- 

    @{ 
     string name= "<b>Praveen</b>";  
    } 

    Hello @name  
    <br><br> 
    Hello @Html.Raw(name) 
---A razor view end--- 

--output ----

の下を参照してください---自動的

こんにちはにPraveenさんをエンコードされたHTML ---それは使用しないのはなぜ

+0

@記号を削除して編集してください。 – ProfK

+0

私の答えを編集しました –

関連する問題