我正在创建一个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")]
当我发出上述请求时,我的路由确实会被调用。
Html.ActionLink生成到控制器操作的链接。因此,如果你试图用一个名为"parameter"的参数链接到名为"MyController"的控制器上的"MyAction"操作,你的链接会是这样的:
@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)
{
...
}
}
如果参数是"MyController"上操作本身的名称,那么您需要将其作为传递
你的链接看起来是这样的:
@Html.ActionLink(item.value, item.value, "MyController")
你的控制器会是这样的(如果item.value="Parameter")
public class MyController : Controller
{
[Route("~/Parameter")]
public ActionResult Parameter()
{
...
}
}
如果你试图链接到某个控制器上没有操作的东西,那么你应该只使用标准的html和Razor来形成链接
<a href="/@(item.value)">@item.value</a>
使用RouteLink而不是ActionLink。使用使用路由名称的RouteLink,然后将routename包含在routeValues对象中。
@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)
至少这是对我有效的,也是我目前正在使用的。。。