是否可以将 ASP.NET Core Web API 和视图与 Razor 一起使用并获得 Intellisense?

问题描述 投票:0回答:1

如果我在 Asp.Net Core 1.x 中构建一个 Web API 项目,并且我想在同一个项目或解决方案中构建前端,是否可以创建前端页面并将 Razor 与 Visual Studio 的 Intellisense 结合使用?

该应用程序是围绕供公共使用的 API 构建的,但由于我的应用程序将使用相同的数据,因此我认为使用我自己的 API 是有意义的,而不是为 API 调用与“常规”MVC(调用控制器,获取模型数据,返回视图)。客户端将拥有自己的前端并获取数据。我将拥有自己的前端,但我希望将其集成到同一个 VS 解决方案中。

一个缺点是我失去了智能感知,因为我是围绕使用从 API 返回的 JSON 来构建它的。我理解 API 的目的是返回数据,而不是视图。我正在尝试充分利用 Visual Studio 功能并提高工作效率。

我读过的都是较旧的。 SO也有较旧的问题。我读了很多关于使用 API 返回视图的内容,但我不确定我是否想要这样。我想同时像普通的非 Web API 项目和 API 项目一样进行操作。

这可能吗?

我的理解是否定的,因为 Razor 的全部意义在于它是在服务器上完成的,而 API 是针对应用程序之外的客户端的。换句话说,我需要构建一个调用我的 API 控制器的控制器,这样我就得到了 Intellisense,这在服务器上似乎有点多余和困难。

一些可能性:

使用 ASP.NET Core 和 Razor 语法构建 REST API

ASP.NEt MVC 使用 Web API 返回 Razor 视图

asp.net mvc 使用 asp.net web api 端点

编辑:这似乎是合乎逻辑的,https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/areas

编辑:这是我所做的,以此作为指导:

https://msdn.microsoft.com/en-us/magazine/mt763233.aspx

我在我的项目中创建了一个区域。在此之下,我创建了一个区域的名称,在此之下,我创建了控制器、视图(以及在此主页下)。

在我添加的 Startup.cs 文件中,

    app.UseMvc(routes =>
    {
        routes.MapRoute(name: "areaRoute",
          template: "{area:exists}/{controller=Home}/{action=Index}");

        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}");
    });

URL 是 localhost:port/AreaName

在我的控制器中,我能够重用服务层中的服务,这是我在项目早期决定的抽象。

namespace books.Areas.Controllers
{
    [Area("Books")]
    public class HomeController : Controller
    {
        private readonly AppSettings _appSettings;

        public HomeController(Microsoft.Extensions.Options.IOptions<AppSettings> appSettings)
        {
            _appSettings = appSettings.Value;
        }
        // GET: /<controller>/
        public IActionResult Index()
        {
            var myConn = _appSettings.ConnectionString;
            var getBooks = new BookLoanService(myConn);
            return View(getBooks.GetAll());
        }
    }
}

这与我的 API 控制器使用的服务层相同。服务层有(我正在使用 Dapper),

public List<books> GetAll()
        {
            using (IDbConnection db = new SqlConnection(_connectionString))
            {
                string SqlString = "SELECT TOP 5 last_name, first_name FROM books";
                var myBooks = (List<books>)db.Query<books>(SqlString);
                return myBooks ;
            }
        }

一旦我能够获取我的类型,我就可以在我的区域的索引中使用 Razor:

@model System.Collections.Generic.List<books>
@{

}
<html>
<body>
    @foreach(var person in Model)
    {
        <ul><li>@person.last_name</li></ul>

    }
</body>
</html>

无需修改,我仍然可以使用 api/values 类型的 URL 来访问我的 API,并且在初始服务器渲染之后,我将能够通过 Ajax 调用 API 来刷新页面的部分内容。

asp.net-mvc visual-studio razor asp.net-web-api asp.net-core-1.0
1个回答
0
投票

是的,可以将 ASP.NET Core Web API 和视图与 Razor 一起使用并获得 Intellisense。然而,这不是一种常见的方法,并且存在一些局限性。

要获得 Web API 视图的 Intellisense,您需要创建一个调用 API 控制器并返回 Razor 视图的控制器。该控制器将充当 Web API 和 Razor 视图之间的中间人,并且将为从 API 控制器返回的数据提供智能感知。

© www.soinside.com 2019 - 2024. All rights reserved.