Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript api工作路线错误_Javascript_Asp.net Mvc_Asp.net Mvc Routing - Fatal编程技术网

Javascript api工作路线错误

Javascript api工作路线错误,javascript,asp.net-mvc,asp.net-mvc-routing,Javascript,Asp.net Mvc,Asp.net Mvc Routing,当我向它发出GET请求时,它会将请求发送到api/FileBrowser,但当我尝试向api发出请求时,会将请求发送到添加了控制器主页的url,并将请求发送到/Home/api/FileBrowser 请帮帮我,我做错了什么 具有2种方法的ApiController public FileBrowserModel Get() { var result = new FileBrowserModel(); List<string> drives =

当我向它发出GET请求时,它会将请求发送到api/FileBrowser,但当我尝试向api发出请求时,会将请求发送到添加了控制器主页的url,并将请求发送到/Home/api/FileBrowser

请帮帮我,我做错了什么

具有2种方法的ApiController

public FileBrowserModel Get()
    {
        var result = new FileBrowserModel();
        List<string> drives = new List<string>();
        foreach (var drive in DriveInfo.GetDrives())
        {
            var path = drive.Name;
            FileManagerCounter fmCounter = new FileManagerCounter(path);
            result.CountTo10Mb += fmCounter.CountTo10Mb;
            result.Countfrom10To50Mb += fmCounter.Countfrom10To50Mb;
            result.CountFrom100Mb += fmCounter.CountFrom100Mb;
            drives.Add(path);
        }
        result.SubDirectories = new List<string>(drives);
        return result;
    }
    [CacheOutput(ServerTimeSpan = 150)]
    [System.Web.Http.HttpGet]
    public FileBrowserModel Get(string path)
    {
        var result = new FileBrowserModel();

        try
        {
            try
            {
                result.ParentPath  = Directory.GetParent(path).FullName;
            }
            catch (Exception)
            {

            }

            var files = Directory.GetFiles(path).ToList();
            result.Files = new List<string>(files);
            result.CurrentPath = path;
            FileManagerCounter fmCounter = new FileManagerCounter(path);
            result.CountTo10Mb = fmCounter.CountTo10Mb;
            result.Countfrom10To50Mb = fmCounter.Countfrom10To50Mb;
            result.CountFrom100Mb = fmCounter.CountFrom100Mb;

            var subDirectories = Directory.GetDirectories(path).ToList();
            result.SubDirectories = new List<string>(subDirectories);
        }
        catch (Exception ex)
        {
            throw new HttpResponseException(HttpStatusCode.InternalServerError);
        }

        return result;
    }
路线

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{path}",
            defaults: new { path = RouteParameter.Optional }
        );
    }
}
public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

编辑:War10ck的答案很简单


下面是另一种解决方案,可以正确构建相对url

问题是,您将url值硬编码为“api/FileBrowser”。因此,基于当前页面,此值将发生更改。如果您在主页上,它将是
Home/api/FileBrowser

您应该做的是构建正确的相对url。由于您使用的是asp.net mvc页面,因此可以使用Url.Action helper方法的advatage来构建正确的相对Url。您可以在razor视图中生成应用程序路由的值,并将其传递给angular controller/数据服务并使用它

在你看来

<script>
    var myApp = myApp || {};
    myApp.Urls = myApp.Urls || {};
    myApp.Urls.baseUrl = '@Url.Content("~")';       
</script>
<script src="~/Scripts/AngularControllerForPage.js"></script>
<script>
    var a = angular.module("FileBrowserApp").value("appSettings", myApp);
</script>
您可以并且应该在数据服务和指令等中访问该url,并使用该url构建正确的url


您还可以考虑将您的HTTP调用从角度控制器移到数据服务。

< >强>编辑< /强>:WAR10CK的答案是简单的解决方案。


下面是另一种解决方案,可以正确构建相对url

问题是,您将url值硬编码为“api/FileBrowser”。因此,基于当前页面,此值将发生更改。如果您在主页上,它将是
Home/api/FileBrowser

您应该做的是构建正确的相对url。由于您使用的是asp.net mvc页面,因此可以使用Url.Action helper方法的advatage来构建正确的相对Url。您可以在razor视图中生成应用程序路由的值,并将其传递给angular controller/数据服务并使用它

在你看来

<script>
    var myApp = myApp || {};
    myApp.Urls = myApp.Urls || {};
    myApp.Urls.baseUrl = '@Url.Content("~")';       
</script>
<script src="~/Scripts/AngularControllerForPage.js"></script>
<script>
    var a = angular.module("FileBrowserApp").value("appSettings", myApp);
</script>
您可以并且应该在数据服务和指令等中访问该url,并使用该url构建正确的url


您也可以考虑将您的HTTP调用从角度控制器移动到数据服务。

< P>如果您绝对确信您的Web API层总是存在于根域之上的一层,那么您可以将您的Ajax调用中的URL更改为:

url: "/api/..."

这将调用相对于根域的api,而不管站点的结构如何。

如果您完全确定Web api层将始终存在于根域之上的一层,则可以将ajax调用中的URL更改为:

url: "/api/..."

这将调用相对于根域的api,而不管站点的结构如何。

如果
api
目录始终高于站点根目录一级,那么简单的
/api/…
就不能做到这一点。如果要从
/Home/Customer/Edit/23
进行调用,该怎么办?。无论您的深度有多深,上述解决方案都会起作用。inIt不知道文件结构的根,但会知道域的根:
www.example.com@War10ck谢谢!我不知道。不用担心,这是干净的东西。您还添加了一个有趣的方法,这是我以前从未见过的+1和快乐编码:)如果
api
目录总是比站点根目录高一级,那么简单的
/api/…
就不会奏效吗?如果您想从
/Home/Customer/Edit/23
调用该怎么办?。无论您的深度有多深,上述解决方案都会起作用。inIt不知道文件结构的根,但会知道域的根:
www.example.com@War10ck谢谢!我不知道。不用担心,这是干净的东西。您还添加了一个有趣的方法,这是我以前从未见过的+1和快乐编码:)这是干净和简单的。谢谢这是干净和简单的。谢谢