我正在根据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)。有什么想法吗?
答案 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渲染和控制器的过程控制之间的区别。