ActionLink助手传递没有参数名

时间:2017-09-03 15:57:03

标签: asp.net-mvc

我有一个使用VS2015创建的asp.net MVC应用程序。

在我的剃刀视图中,我有以下内容:

@Html.ActionLink(linkText: "Detail",
                                     actionName: "Index",
                                     controllerName: "SupportNotificationDetail",
                                     routeValues: new { id = item.DetailFilename },
                                     htmlAttributes: null)

我的控制器方法的定义如下:

public class SupportNotificationDetailController : Controller
    {
        // GET: SupportNotificationDetail
        public ActionResult Index(string id)

我没有更改默认路由配置。

我的问题是,操作链接产生以下网址:

ESBAMPortal/SupportNotificationDetail/Index/%7B43794F0E-23AD-4A70-AF39-3364E93F5832%7D.html

为此,我收到404错误。如果我手动编辑浏览器地址栏中的URL以便id参数被命名 - 那么加载正确的页面:

ESBAMPortal/SupportNotificationDetail/Index?id=%7B43794F0E-23AD-4A70-AF39-3364E93F5832%7D.html

如果我能找到以下任何一种方法的答案,那么今晚我将能够入睡:

为什么没有指定id参数的url会给出404? 如何让ActionLink助手提供所需的URL?

1 个答案:

答案 0 :(得分:1)

当您请求网址yourSiteName/SupportNotificationDetail/Index/somefile.html时,请求将由IIS处理,因为请求网址正在查找静态内容html文件(请求中特别包含文件扩展名)。所以iis会尝试直接提供它而不需要通过MVC请求管道。

但是当你请求yourSiteName/SupportNotificationDetail/Index?id=somefile.html时,somefile.html是一个查询字符串值。因此,IIS不会直接为响应提供服务。它将被发送到MVC管道,并且由于请求与路由表中注册的路由定义匹配,因此它将被转发到具有参数id和它的值的Index操作方法。

默认MVC路由定义的请求网址格式为{controller}/{action}/{id},其中id是操作方法的可选参数。因此,helper方法生成与上述模式匹配的链接,因此您将获得不包含id参数的URL。

您可以将参数名称从Id更改为其他名称,然后ActionLink帮助程序方法将生成具有显式查询字符串参数名称的目标URL。

public class SupportNotificationDetailController : Controller
{
    public ActionResult Index(string fildId)
    {
        return Content(fildId);
    }
}

在视图中,

@Html.ActionLink("Detail", "Index",  "SupportNotificationDetail",
                                      new { fildId = Model.DetailFilename }, null)