2017-09-03 40 views
0

我有一个使用VS2015创建的asp.net MVC应用程序。ActionLink助手通过参数,无参数名称

以我剃刀视图,我有以下:

@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

当您请求url yourSiteName/SupportNotificationDetail/Index/somefile.html时,请求将由IIS处理,因为请求url正在查找静态内容html文件(该请求明确具有文件扩展名)。所以iis会尝试直接提供服务,而不需要通过MVC请求管道。

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

默认MVC路由定义的请求url模式为{controller}/{action}/{id},其中id是操作方法的可选参数。出于这个原因,辅助方法会生成链接以匹配上述模式,因此您将得到没有id参数的url。

您可以将参数名称从Id更改为其他内容,然后ActionLink助手方法将使用显式querystring参数名称生成目标url。

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

并在视图,

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