当actionName像“/ controllerName / action /”时,Html.ActionLink()会添加不需要的文件夹

时间:2013-03-04 20:16:27

标签: c# asp.net-mvc razor

我创建了一个名为ApplicationController的Controller,它向我的所有视图发送公共信息,系统中的每个控制器都从它继承。

在局部视图中,我使用Html.ActionLink():

@Html.ActionLink("Link Title", "/MyController/MyAction")
// OUTPUT: <a href="/MyIISVirtualDirectory/Application/MyController/MyAction">Link Title</a>

如果我点击链接,我会收到404。

但如果我使用:

@Html.ActionLink("Link Title", "MyAction", "MyController")
// OUTPUT: <a href="/MyIISVirtualDirectory/MyController/MyAction">Link Title</a>

一切正常。

为什么在第一个例子中输出/ Application /?如何在默认情况下删除它?

4 个答案:

答案 0 :(得分:3)

如果你正在使用Razor 2.0(ASP.NET MVC 4),你可以使用一个普通的旧链接:

<a href="~/MyController/MyAction">Link Title</a>

如果您的应用托管于/MyController/MyAction,则href将转换为/,如果您的应用托管在/MyIISVirtualDirectory/MyController/MyAction,则href将转换为/MyIISVirtualDirectory

在Razor 1.0(ASP.NET MVC 3)中,语法有点冗长:

<a href="@Href("~/MyController/MyAction")">Link Title</a>

更多信息here

答案 1 :(得分:1)

最简单的方法就是这样做:

<a href="@Url.Content("~/MyController/MyAction")">Link Title</a>
然而,它完全打破了路由逻辑。这应该用于内容文件(顾名思义),css,js等...不适用于控制器操作。如果更改默认路由,则上面的URL可能会中断。

答案 2 :(得分:0)

我认为通过将路由作为参数来调用控制器的动作方法是不可能的。这是一个包含Html.ActionLink所有扩展名的链接。

http://msdn.microsoft.com/en-us/library/system.web.mvc.html.linkextensions.actionlink(v=vs.108).aspx

路由在global.asax中定义,您可以根据需要定义路由。 / Application /来自输出是您的ApplicationController。默认情况下,您在其中调用视图的控制器是搜索操作方法的控制器。

希望它有所帮助。

答案 3 :(得分:0)

实施您自己的Action Link助手:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public static class CustomHtmlHelpers
    {
        public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string routePath)
        {
            //you can do any sort of logic you want here.
            return MvcHtmlString.Create(string.Format("<a href=\"{0}\">{1}<a/>", routePath, linkText));
        }
    }
}
相关问题