2012-01-13 46 views
0

HomeController.cs代碼:如何從Mvc後面的代碼生成ActionLink?

if (User.Identity.IsAuthenticated) 
      { 
       var profile = Profile.GetProfile(User.Identity.Name); 
       ViewData["Message"] = "Welcome " + profile.FirstName + "!"; 
      } 
      else 
      { 
       ViewData["Message"] = "Welcome to myblog."; 
       ViewData["RegisterLink"] = "please register <%:Html.ActionLink('Register', 'Register', 'Account')%>."; 
      } 

如果用戶沒有登錄它應該有顯示 歡迎myblog並請註冊(必須是ActionLink的)

和Index.aspx的裏面的內容代碼:

<%: ViewData["RegisterLink"] %> 

但是我沒有生成ActionLink請幫忙。

回答

4

有許多不同的方法來解決你想要什麼,我更喜歡強類型的視圖的方法,但你可以嘗試以下方法:

ViewData["RegisterLink"] = "true"; 

然後你的視圖中,如果RegisterLink是真實的,顯示的ActionLink( )。

+0

我需要把 「瞭解更多關於Maver icks系統註冊你自己<%:Html.ActionLink('Register','Register','Account')%>「? – Neo 2012-01-13 15:28:05

+0

這裏發生的事情是,你在你的ActionResult中設置ViewData []變量,這恰好被認爲是*服務器端代碼*。一旦設置了這些變量,你的View()就會被調用。由於ViewData []變量在*之前被設置* View實際顯示,所以您可以訪問(並驗證)這些變量中的值。所以......這意味着你可以測試以下內容:if(ViewData [「RegisterLink」] ==「true」)...顯示你的Html.ActionLink(...)。請記住,這段代碼*不在控制器內部。 – Vlince 2012-01-13 15:37:26

3

這是如何從代碼

TagBuilder linkBuilder = new TagBuilder("a"); 
linkBuilder.MergeAttribute("href", Url.Action("Register", "Account")); 
linkBuilder.SetInnerText("Please Register"); 
ViewData["RegisterLink"] = linkBuilder.ToString(); 
3

產生錨,我想避免使用ViewData的,並使用一個強類型的視圖模型來處理這個問題。

我的視圖模型將是這樣

public class LoggedInUserViewModel : 
{ 

    public bool IsValid { set;get;} 
    public string DisplayName { set;get;} 

} 
在控制器

,檢查用戶被認證,並設置視圖模型對象的屬性和視圖模型對象傳遞給查看

LoggedInUserViewModel objVM=new LoggedInUserViewModel(); 
if (User.Identity.IsAuthenticated) 
{ 
    objVM.IsValid=true; 
    objVm.DisplayName="Name from your user entity" 

} 
return View(objVm); 

並在查看

@if(Model.IsValid) 
{ 
    @Html.ActionLink("Register", "Register", "Users") 
} 
else 
{ 
    Welcome @Model.DisplayName 
    @Html.ActionLink("Profile", "Profile", "Users") 
}