Url.Action没有给我实际的Url

Jay*_*Sun 3 javascript asp.net-mvc asp.net-mvc-3

我有一个名为"索引"的视图.页面上有一个搜索栏,当您点击提交时,我有Javascript重定向:

var alerted='@url';
var url=alerted + "/" + $("#SearchText").val();
Run Code Online (Sandbox Code Playgroud)

在Razor视图中,url是一个定义为的变量var url = Url.Action("Index", "Search");

但是在Javascript中,警告输出"/".我不知道为什么会这样.如果我将其更改为另一个控制器视图,那很好.但如果我从索引中调用索引,它就什么也没给我.是什么赋予了?我需要它来给我我所在页面的网址.

DMu*_*gan 5

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

Url.Action("Index", "Search", null, Request.Url.Scheme)
Run Code Online (Sandbox Code Playgroud)

如果你需要一个绝对的URL.

在你的gloabal.asax中,你可能有一个如下所示的路由方案:

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

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

@Url.Action("Index", "Search")
Run Code Online (Sandbox Code Playgroud)

会产生"/ Search/Index",因为"/"不再是有效的URL.我实际上并不建议这样做,但要了解正在发生的事情,了解它是有用的.

如果您添加的默认路线之前

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

那么所有来自的调用Url.Action("Search","Index")都会在URL中产生"/ Search/Index",因为他们首先点击了此路由.但是,如果直接输入浏览器,输入无操作或控制器仍会正确地将您带到索引页面.