如何在c#ViewData字符串中使用razor actionlink创建动态HTML标记

时间:2015-05-01 18:18:14

标签: c# html asp.net-mvc razor

我正在根据MVC C#中的用户角色创建动态菜单,并且(虽然我可以加载HTML标签)菜单中的Action链接不会呈现。我想这是因为开头的@ at符号:

if(userGroup.Equals("Administrators")){
   menuItems+=@"<span class=""menuItem"">
                      @Html.ActionLink(""Add User"", ""RegisterNewUser"", ""Home"", null, new{@Class=""menuItemActionLink""})
                      </span>";
}
(...)
ViewData["menuItems"]=menuItems;

使用视图检索:

@Html.Raw(@ViewData["menuItems"])

我尝试过html编码的变种无济于事。我能想到的最好的解决方案是使用at符号转义码,但我不知道它是什么(我试过&#39; \&#39;以及#34形式的连接; @& #34; + @&#34; Html.ActionLink)。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

虽然我不确定为什么actionlink没有正确呈现(可能是类中的大写C?),但是从控制器向视图发送html的做法并不好理念。这会混淆控制器和视图的角色,并使任何期望区分这些实体的人更加困难。

更好的选择可能是在视图中有一个代码块,例如:

@if (ViewData["admin"] != null){  ...code to render your admin menu ... }

并在您的控制器中:

if(userGroup.Equals("Administrators")){ ViewData["admin"] = true; }

根据您的需要,这些代码段可能会发生变化。你可以测试true或false(而不是null),或者添加一个字符串; ViewData几乎就是你所做的。但这至少保持了View的HTML渲染和控制器的过程控制之间的区别。