是否可以使用ASP.NET Core Web API和Razor视图并获取Intellisense?

joh*_*nny 6 asp.net-mvc visual-studio razor asp.net-web-api asp.net-core-1.0

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

该应用程序是围绕一个公共消费的API构建的,但由于我的应用程序将使用相同的数据,我认为使用我自己的API而不是为API调用和"常规"MVC构建单独的方法或构造是有意义的(调用controller,获取模型数据,返回视图).客户端将拥有自己的前端并获取数据.我将拥有自己的前端,但我希望它集成在同一个VS解决方案中.

一个缺点是我失去了我的智能感知,因为我正在构建它,消耗从API返回的JSON.我知道API是关于返回数据而不是视图.我正在努力获得最好的世界,并通过Visual Studio功能提高工作效率.

我读过的都比较旧.SO也有较老的问题.我阅读了很多关于使用API​​返回视图的内容,但我不确定是否需要它.我想同时做一个普通的非Web API项目和API项目.

这可能吗?

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

一些可能性:

使用带有Razor语法的ASP.NET Core构建REST API

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

asp.net mvc消费asp.net web api终点

编辑:这似乎是合乎逻辑的,https://docs.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}");
    });
Run Code Online (Sandbox Code Playgroud)

URL是localhost:port/AreaName

在我的Controller中,我能够重用我的服务层中的服务,这是我在项目早期决定的抽象.

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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这与我的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 ;
            }
        }
Run Code Online (Sandbox Code Playgroud)

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

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

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

    }
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

在没有修改的情况下,我仍然可以使用我的api/values类型的URL来访问我的API,并且我可以通过Ajax调用API在初始服务器呈现之后刷新我的页面的一部分.

小智 0

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

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