如何创建MVC5 ActionLink到根路由 - 没有查询字符串

时间:2015-04-05 18:36:05

标签: .net asp.net-mvc-5

我正在创建一个MVC项目,我有一个共享的局部视图,我想要一个带有参数的根网站链接。所以https://site.invalid/j123456-123。我能够做到这一点的唯一方法是使用HTML.Raw。我更喜欢使用更符合MVC约定的方法。

<a href="@Html.Raw(string.Format("/{0}", item.value))">@item.value</a> 
@Html.ActionLink(item.value,null, new{controller="MyController", action=string.Empty, parameter= item.value})

原始html方法有效,actionlink生成/?parameter=J123456-123。我不想要?或链接上显示的参数名称。

我最初尝试使用传统路由,但现在使用基于属性的路由。

我想要使用的路线的属性是   [Route("~/{parameter:regex([aAjJfF]\\d+-\\d+)}", Name = "ViewByParam")]

当我提出上述请求时,我的路线会被调用。

2 个答案:

答案 0 :(得分:0)

Html.ActionLink生成指向控制器操作的链接。因此,如果您尝试链接到名为&#34; MyAction&#34;在名为&#34; MyController&#34;的控制器上使用名为&#34;参数&#34;的参数;你的链接看起来像这样:

@Html.ActionLink(item.value, "MyAction", "MyController", new { parameter = item.value }, null)

你的控制器看起来像这样(假设你的正则表达式是正确的):

public class MyController : Controller
{
    [Route("~/{parameter:regex([aAjJfF]\\d+-\\d+)}", Name = "ViewByParam")]
    public ActionResult MyAction(string parameter)
    {
        ...
    }
}

如果参数是&#34; MyController&#34;上的动作本身的名称。然后你需要传递它

您的链接如下所示:

@Html.ActionLink(item.value, item.value, "MyController")

你的控制器看起来像这样(如果item.value =&#34;参数&#34;)

public class MyController : Controller
{
    [Route("~/Parameter")]
    public ActionResult Parameter()
    {
        ...
    }
}

如果您尝试链接到某个控制器上没有操作的内容,那么您应该使用标准html和Razor来构建链接

<a href="/@(item.value)">@item.value</a>

答案 1 :(得分:0)

而不是ActionLink使用RouteLink。使用使用路由名称的RouteLink,然后在routeValues对象中包含routename。

@Html.RouteLink(linkText, "ViewByParam", new {controller= "controllerName", action="ViewByParam", id=item.Id})

在控制器内部,使用属性:

[Route("~/{id:regex([aAjJfF]\\d+-\\d+)}", Name = "ViewByParam")]
public ActionResult ViewByParam(string id)

至少这对我有用,我现在正在使用......