2012-01-04 77 views
1

我对asp.net mvc很新颖。我想获取我的网址中的参数字符串值不能为空。参数名称:asp.net mvc中的字符串C#

http://localhost/Item/ItemSpec/3431?dep=62&cat=129&tab=2 

如何获得值= 3431?我试过使用HttpContext.Current.Request.QueryString["id"],但它不起作用。 3431是显示在我的页面中的项目的id,这就是我使用[“id”]的原因。

非常感谢。

回答

2

3431是请求的路径的一部分,而不是查询字符串的一部分。你可能使用HttpRequest.Path来获取路径,但MVC路由应该允许你简单地写一个控制器方法,接受ID作为参数。我建议你阅读how to configure routing。 (只是在寻找,ASP.NET路由或MVC路由会给你很多文章

+0

它可以通过正则表达式或其他路由旁边的其他功能吗? – titi 2012-01-04 07:55:16

+2

@titi - 当然,你可以,但那么你会有2个问题 – 2012-01-04 08:25:26

+1

@titi:可能 - 但你为什么要?路由为你解决了这个问题 - 为什么把事情变得更复杂? – 2012-01-04 08:26:42

2

假设默认路由在Global.asax中配置({controller}/{action}/{id}),你可以有你的控制器动作以ID参数和默认的模型绑定会自动将其值设置:

public ActionResult Foo(string id) 
{ 
    ... 
} 

如果你想从确实有权访问你需要从RouteData获取它的HttpContext你的代码的一些其他部分取值这个ID:

var id = HttpContext.Request.RequestContext.RouteData["id"]; 

RouteData适用于所有标准MVC位置。在你的例子中,你已经使用了静态的HttpContext.Current属性,这是你永远不应该使用的东西。我怀疑你试图从你不应该访问HttpContext的部分代码中获取这个id。因此,您最好使用标准技术获取此id,然后将其作为参数传递给代码的其他部分。

1

如果项目是你的控制器,并ItemSpec是行动,你可以通过

public ActionResult ItemSpec(int id) { } 

你的路由,必须设置以获取编号:

context.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index" } 
); 
0

如果你没有改变你的路由,所以它仍然被定义为当你创建Asp.net MVC Web项目时,那么这应该是你的控制器之一:

public class ItemController : ControllerBase 
{ 
    ... 

    public ActionResult ItemSpec(int id, int dep, int cat, int tab) 
    { 
     // implementation that uses all four values 
    } 

    ... 
} 

这当然只是其中的一个操作。也可能有其他人。最有可能的是默认生成的Index,默认情况下也使用该路由...