我创建了一个名为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 /?如何在默认情况下删除它?
答案 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));
}
}
}