点击/mysite时是否可以在ASP.NET-MVC中读取查询字符串?q=123

点击/mysite时是否可以在ASP.NET-MVC中读取查询字符串?q=123,asp.net-mvc,routing,Asp.net Mvc,Routing,我有一个网站,外部网站正在链接到一个活动ID 或者(用斜杠) 如果您错过了斜杠,大多数浏览器都会为您添加斜杠。因此,在任何一种情况下,无论您输入哪个URL,我的应用程序被命中,都是上面的第二个URL。QueryString参数始终可用 我注意到使用ASP.NET MVC路由(甚至可能没有)时,当我使用虚拟目录时,我不会得到相同的行为 例如,如果我有'http://www.example.com/virtualdirectory?cid=123“,这将到达我的“default.aspx”页面(

我有一个网站,外部网站正在链接到一个活动ID

或者(用斜杠)

如果您错过了斜杠,大多数浏览器都会为您添加斜杠。因此,在任何一种情况下,无论您输入哪个URL,我的应用程序被命中,都是上面的第二个URL。QueryString参数始终可用

我注意到使用ASP.NET MVC路由(甚至可能没有)时,当我使用虚拟目录时,我不会得到相同的行为

例如,如果我有
'http://www.example.com/virtualdirectory?cid=123“
,这将到达我的“
default.aspx
”页面(因为它与任何路由都不匹配)。但是当我检查
Request.QueryString
的值时,它是空的。如果我去
'http://www.example.com/virtualdirectory?cid=123“
,则
查询字符串
值出现在
请求
对象中

如果我在新创建的MVC项目(MVC 1.0的RTM版本-2009年3月)中的
Default.aspx.cs
中放置断点,那么我将看不到任何查询参数

我想知道如果用户通过类似
/virtualdirectory?cid=123
的URL访问虚拟目录,是否有任何方法可以访问IIS6和/或IIS7中的这些参数


可能没有解决方案——但我很高兴在将任何合作伙伴链接到虚拟目录之前发现了这一点

一个可能的解决方法——我不确定我是否会称之为解决方案——是在IIS 7中制定重写规则,或者使用IIS 6的重写器将斜杠放回原位。

当您尝试使用IIS服务器变量,特别是HTTP\U URL变量访问原始URL时,会得到什么

使用MVC很容易做到这一点。在为您创建的
HomeController
中,向名为
String cid
Index()
方法添加一个方法属性。像这样:

        public ActionResult Index(string cid)
    {

因为它是一个字符串,所以可以忽略它,因此如果您只请求了“”,那么
cid
将是
null
。我刚刚在我的一个网站上测试过这个,当你添加斜杠和不带斜杠的时候,这个值就会传入。

你的链接应该是这样的形式

由于您是操作方法“Index”在主控制器中,因此默认的Index方法将处理此问题

public ActionResult Index(int id){}
具体来说,您可以像这样使用AcceptVerbs属性

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(int id){}

如果您想添加更多查询字符串参数,例如,然后添加一个单独的路由图来处理此URL,并相应地更改您的操作方法,则默认路由图应处理您的请求。一些答案不理解此问题。如果将应用程序放在虚拟目录中,则浏览到“”与“”会有不同的行为

我刚刚使用VisualStudioDevelopmentServer尝试了这个方法,并且能够重现这个问题

这似乎与您是否在HomeController的Index方法上有参数无关


在我看来,web服务器正在将/virtualdirectory?cid=123重写为/virtualdirectory/default.aspx?在asp.net收到请求之前。

我会在有机会时查看。幸运的是,我们还没有发布很多这样的链接。我只是以前从来都不知道这种行为,我想也许你无能为力——我只是对这种行为感到惊讶,我想我会问。幸运的是,我很快就发现它是多么“挑剔”