在MVC Razor视图中为Html.ActionLink转换字典至字符串的问题
问题描述
我有一个Dictionary<string, string>,想用它的键值对生成Html.ActionLink链接。规则是优先使用TValue(如果不为空),否则用TKey(比如GetUserProfile作为键时,显示User Profile更符合UI需求)。
现在代码抛出错误:
CS1928: 'System.Web.Mvc.HtmlHelper' 不包含“ActionLink”的定义,最佳扩展方法重载存在无效参数
我确定问题出在传入了Dictionary<string, string>的键值对对象(navItem)而非字符串类型的Action名称。请问怎么把字典的TKey/TValue转成符合要求的字符串,或者有没有其他实现思路?
代码示例:
@{ Dictionary<string, string> nav = new Dictionary<string, string>() {{ "Email", "" }, { "Username", "" }, { "EditProfile", "Edit Profile" }}; } @foreach (var navItem in nav) { if (navItem.Value.IsEmpty()) { <li> @Html.ActionLink(navItem.Key, navItem, "ControllerName") </li> } else { <li> @Html.ActionLink(navItem.Value, navItem, "ControllerName") </li> } }
解决方法
错误核心是你把整个KeyValuePair<string, string>对象(navItem)传给了ActionLink的第二个参数(该参数需要字符串类型的Action名称),而非字典的Key(也就是对应控制器的Action方法名)。
修正后的代码
直接将navItem.Key作为Action名称参数传入,字典的Key对应Action方法名,Value仅作为显示文本使用:
@{ Dictionary<string, string> nav = new Dictionary<string, string>() { { "Email", "" }, { "Username", "" }, { "EditProfile", "Edit Profile" } }; } @foreach (var navItem in nav) { // 优先用Value,为空则用Key作为显示文本 var displayText = string.IsNullOrEmpty(navItem.Value) ? navItem.Key : navItem.Value; <li> @Html.ActionLink(displayText, navItem.Key, "ControllerName") </li> }
额外优化建议
- 可将判断显示文本的逻辑抽成辅助方法,避免重复代码
- 如果需要给链接添加HTML属性(如class),可使用
ActionLink的重载:@Html.ActionLink(displayText, navItem.Key, "ControllerName", null, new { @class = "nav-link" })
内容的提问来源于stack exchange,提问作者whisk
相关产品推荐
相关产品推荐

