我有一个使用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?
答案 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)