2

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

在部分视图中,我使用 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

4 回答 4

3

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

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

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

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

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

更多信息在这里

于 2013-03-04T20:47:50.803 回答
1

做你想做的最简单的方法是:

<a href="@Url.Content("~/MyController/MyAction")">Link Title</a>

但是,它完全破坏了路由逻辑。这应该用于内容文件(顾名思义)、css、js 等......而不是用于控制器操作。如果您更改默认路由,上述 URL 可能会中断。

于 2013-03-04T20:42:54.177 回答
0

实现你自己的动作链接助手:

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));
        }
    }
}
于 2013-03-04T20:41:14.477 回答
0

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

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

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

希望能帮助到你。

于 2013-03-04T20:36:40.713 回答