2012-05-01 30 views
3

我有一个称为“索引”的视图。还有的页面上的搜索栏,当你点击提交,我有JavaScript重定向:Url.Action不给我真实的网址

var alerted='@url'; 
var url=alerted + "/" + $("#SearchText").val(); 

在Razor视图,url是被定义为var url = Url.Action("Index", "Search");

但在javascript中的变量,惊动输出“/ ”。我不知道这是为什么。如果我将其更改为另一个控制器视图,那很好。但是如果我打电话给索引索引,它什么也不给我。是什么赋予了?我需要它将网址提供给我所在的网页。

+0

我也有过这个问题。它与名为Index的操作的惯例有关,它来自同一个控制器。将索引的名称更改为其他内容并尝试使用 –

回答

5

您正在使用相对URL。您的默认控制器的Index操作的相对URL是“/”。尝试使用

Url.Action("Index", "Search", null, Request.Url.Scheme) 

如果您需要绝对URL。

在你gloabal.asax你可能有一个看起来像路由方案:

routes.MapRoute(
       "Default", // Route name 
       "{controller}/{action}/{id}", // URL with parameters 
       new { controller = "Search", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
); 

的默认值是如果提供什么,该路由使用的控制器/动作。如果您从最后一个参数中删除了控制器和操作属性,则索引和搜索将不再是您的默认操作和控制器。现在

@Url.Action("Index", "Search") 

将产生“/搜索/索引”,因为“/”不再是一个有效的URL。我实际上不建议这样做,但了解发生的事情对了解它很有用。

如果之前你的默认路由你添加

routes.MapRoute(
       "Index", // Route name 
       "Search/Index/{id}", // URL with parameters 
       new { controller = "Search", action = "Index", id = UrlParameter.Optional } // Parameter defaults); 

然后从Url.Action("Search","Index")所有呼叫将产生“/搜索/索引”中的URL,因为他们会先打这个路由。但是,如果直接输入到浏览器中,则不输入任何操作或控制器仍然可以正确地将您带到索引页面。

+0

我不知道那会经过相对URL的问题,谢谢!我最终重命名了我的索引操作以避开它。 –

+0

搜索/索引也恰好是我的global.asax中的默认URL,所以在我的本地URL中,URL显示为“http:// localhost:16721 /'。我怎样才能让它显示为'http:// localhost:16721/Search/Index /',同时仍将它作为global.asax中的默认值? –

+0

它解析为“/”的原因是默认的Controller和Action匹配。这意味着“/”与“/ Search/Index”相同。这与默认项目不是“/ home/index”的原因相同。 –

相关问题