我想用模型中的数据填充一系列动作链接。为了实现这一点,我创建了一个名为ActionLinkModel的模型
public class ActionLinkModel
{
public ActionLinkModel(string linkText, string actionName = "Index", string controllerName = "Home", Dictionary<string, string> routeValues = null, Dictionary<string, string> htmlAttributes = null)
{
LinkText = linkText;
ActionName = actionName;
ControllerName = controllerName;
RouteValues = routeValues == null ? new Dictionary<string, string>() : routeValues;
HtmlAttributes = htmlAttributes == null ? new Dictionary<string, string>(): htmlAttributes;
if(!HtmlAttributes.ContainsKey("title")) {
HtmlAttributes.Add("title",linkText);
}
}
public string LinkText { get; set; }
public string ActionName { get; set; }
public string ControllerName { get; set; }
public Dictionary<string, string> RouteValues { get; set; }
public Dictionary<string, string> HtmlAttributes { get; set; }
}
然后在我看来,我称之为:
@foreach (var link in Model.Links) {
@Html.ActionLink(link.LinkText, link.ActionName, link.ControllerName, link.RouteValues, link.HtmlAttributes);
}
不幸的是,这并没有呈现我希望的方式,问题在于routevalues和htmlAttibutes。我无法弄清楚他们需要什么类型,在Html.Actionlink的签名中我看到它们是对象或RouteValueDictionary / IDictionary。 我也见过这样的结构:
Html.ActionLink(“主页”,“索引”,“主页”,null, new {title =“Home”,class =“myClass”})
但new { title="Home", class="myClass"}
创建的是哪种类型?
我该怎么做?,我想照顾模型中的内容,并尽可能简化视图中的代码。
答案 0 :(得分:1)
new { title="Home", class="myClass"}
使用提供的属性值转换为匿名对象。
要回答您的问题,您需要将Model对象修改为以下内容。 Dicationary对象必须是Dictionary<string,object>
。
public class ActionLinkModel
{
public string LinkText { get; set; }
public string ActionName { get; set; }
public string ControllerName { get; set; }
public IDictionary<string, object> RouteValues { get; set; }
public IDictionary<string, object> HtmlAttributes { get; set; }
}
在视图代码中使用以下
@foreach (var link in Model.Links) {
@Html.ActionLink(link.LinkText, link.ActionName, link.ControllerName, new RouteValueDictionary(model.RouteValues), model.HtmlAttributes)
}
我们将字典对象包装到RouteValueDictionary
。如果不这样做,那么它将被CLR转换为Object
重载,并且会给出不正确的结果。