C# MVC中的参数未从路由正确传递到视图中

C# MVC中的参数未从路由正确传递到视图中,c#,asp.net-mvc,asp.net-mvc-3,routes,C#,Asp.net Mvc,Asp.net Mvc 3,Routes,我在自学MVC,但在正确布线方面遇到了问题 我有一个名为“ClipsController”的控制器和一个名为“Index”的视图(我知道这很无聊) 我使用以下路径配置了routeconfig文件: routes.MapRoute( "Clips", "Clips/{id}", new { controller = "Clips", action = "Index", id = urlparameters.Optional } ); 在“默认”路线之前。当我转到/Clip

我在自学MVC,但在正确布线方面遇到了问题

我有一个名为“ClipsController”的控制器和一个名为“Index”的视图(我知道这很无聊)

我使用以下路径配置了routeconfig文件:

routes.MapRoute(
    "Clips",
    "Clips/{id}",
    new { controller = "Clips", action = "Index", id = urlparameters.Optional }
);
在“默认”路线之前。当我转到/Clips/ExampleID时 它确实命中了正确的路由,并且确实在Clips控制器中启动了索引操作。我遇到的问题是参数“ID”无法进入索引页,但我最终使用URL domain.my/Clips/ExampleID执行Clips控制器的索引操作

我尝试使用获取ID参数

httpcontext.current.request.querystring["id"]
它总是返回空值。我在控制器中的操作结果如下:

public ActionResult Index(string id)
{
    return view()
}
重申一下,我无法在索引视图上看到querystring id,即使URL的路由正确,而且据我所知,控制器中的actionresult是正确的。如果我做错了什么,或者你需要更多的信息,请告诉我,谢谢

我尝试使用获取ID参数

httpcontext.current.request.querystring[“id”]

否,此url中没有任何查询字符串参数:

http://domain.my/Clips/ExampleID
查询字符串参数跟随url中的
字符。例如,如果您有以下url:

http://domain.my/Clips?id=ExampleID
然后,您可以尝试使用初始代码读取
id
查询字符串参数

使用此url:
http://domain.my/Clips/ExampleID
您可以查询
id
route value参数。但是使用
HttpContext.Current
绝对是错误的。绝不能在ASP.NET MVC应用程序中使用
HttpContext.Current
。恰恰相反,您可以在任何可以访问
HttpContextBase
的地方访问这些信息(在ASP.NET MVC应用程序管道中几乎无处不在):

长话短说,如果需要在控制器操作中查询此参数的值,只需使用提供的
id
参数:

public ActionResult Index(string id)
{
    // Here the id argument will map to ExampleID
    return view()
}
此外,您可能不需要自定义路线:

routes.MapRoute(
    "Clips",
    "Clips/{id}",
    new { controller = "Clips", action = "Index", id = urlparameters.Optional }
);
这是完全冗余的,默认路由已经覆盖了它:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

因此,摆脱您的自定义路线是非常自由的。

您尝试的url是什么
youriste.com/clips/anystring
应使用您提供的信息。这就是为什么您的操作会使用参数
id
。这将由路由中的值填充,因此这是您应该在操作中使用的值。在您访问的URL中没有querystring,因此尝试从
querystring
访问任何内容都将返回null。我想使用自定义路由进行学习,我知道默认路由会捕获它,我只是想让它不显示clips/index/id。因此对于url“domain.my/clips/IdIWantToGet”,我将使用httpContext.Request.RequestContext.RoutedData.Values[“id”],它将返回字符串“IdIWantToGet”?是的,如果需要在控制器操作之外的某个地方访问此值。在控制器操作中,您可以简单地使用
id
参数。但您还没有完全指定需要在何处访问此值。如果您在视图中需要它,那么显然您不会使用
httpContext.Request.RequestContext.RouteData.Values[“id”]
。您可以在控制器操作中使用视图模型,该视图模型将根据控制器操作所采用的
ID
参数填充ID属性。好的,这有助于我更好地理解MVC过程,因此我将给出正确的答案。非常感谢你
routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);