MVC3和URL(使用区域,构建<a> tag)</a>时遇到问题

时间:2011-08-08 20:09:27

标签: c# asp.net-mvc-3

我遇到区域问题并从中生成链接。这是我正在使用的代码的粗略结构:

家庭 区域1
区域1内容
区域2
区域2内容
区域3
区域3内容

在我的_layout.cshtml文件中,我生成一个菜单(完全由表驱动):

foreach (MainMenu mm in parentMenus)
{
    List<SubMenu> theseChildren = childMenus.Where(o => o.MainMenuId == mm.MainMenuId).OrderBy(p => p.Ordering).ToList();

    result.Append(String.Format(@"<h3><a href='#'>{0}</a></h3>", mm.Name));
    result.Append(String.Format(@"<div>"));
    result.Append(String.Format(@"<p>"));
    foreach(SubMenu sm in theseChildren){

        //Issue is here:

        result.Append(String.Format(@"<a href='{0}/{1}/{2}'>{3}</a> <br />", sm.AreaName == null ? String.Empty : sm.AreaName, sm.ControllerName, sm.ActionName, sm.Name));
    }
    result.Append(String.Format(@"</p>"));
    result.Append(String.Format(@"</div>"));
}

它的构建是因为它是为手风琴(jQuery)生成的。

所以,问题出在foreach循环中。当代码在“Home”区域运行时,它很好,但是当它在本地区域外运行时,它会产生奇怪的结果。

所以,例如,我在数据库中有一个记录OPS。它应该创建一个指向OPS / OPS / INDEX的链接(area = OPS,Controller = OPS,Action = INDEX)。在家庭“区域”,它很好,但当它在一个区域,它出来“http:// localhost:17416 / Home / OPS / OPS / INDEX”

任何可以提供的帮助都会很棒!

先谢谢大家。

3 个答案:

答案 0 :(得分:7)

您必须更改代码以在链接中指定区域,如下所示:

@Html.ActionLink("Label", "Action", "Controller", new { area = "Area" }, null)

这应该有效:

foreach(SubMenu sm in theseChildren){
    result.Append(@Html.ActionLink(sm.Name, sm.ActionName, sm.ControllerName, new { area = sm.AreaName }, null).ToHtmlString());
}   

希望这会有所帮助......

答案 1 :(得分:6)

使用它:

String.Format(
    "<a href='{0}'>some text you want</a>",
    Url.Action("ActionName", "ControllerName", new { area = "AreaName" })
    );

而不是:

String.Format(
    @"<a href='{0}/{1}/{2}'>{3}</a> <br />",
    sm.AreaName == null ? String.Empty : sm.AreaName,
    sm.ControllerName,
    sm.ActionName, sm.Name)

例如:

String.Format(
    "<a href='{0}'>{1}</a>",
    Url.Action(sm.ActionName, sm.ControllerName, new { area = sm.AreaName }),
    sm.Name
    );

答案 2 :(得分:0)

以上标记的答案将不起作用该区域应该在A大写

@Url.Action("Action", "Controller", new { Area = "AreaName" }, null)
@Html.ActionLink("Label", "Action", "Controller", new { Area = "AreaName" }, null)