如果我在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}"); });
URL是localhost:port/AreaName
在我的Controller中,我能够重用我的服务层中的服务,这是我在项目早期决定的抽象.
namespace books.Areas.Controllers { [Area("Books")] public class HomeController : Controller { private readonly AppSettings _appSettings; public HomeController(Microsoft.Extensions.Options.IOptionsappSettings) { _appSettings = appSettings.Value; } // GET: / / public IActionResult Index() { var myConn = _appSettings.ConnectionString; var getBooks = new BookLoanService(myConn); return View(getBooks.GetAll()); } } }
这与我的API控制器使用的服务层相同.服务层有(我正在使用Dapper),
public ListGetAll() { using (IDbConnection db = new SqlConnection(_connectionString)) { string SqlString = "SELECT TOP 5 last_name, first_name FROM books"; var myBooks = (List )db.Query (SqlString); return myBooks ; } }
一旦我能够获得我的类型,我就可以在我的区域中的索引中使用Razor:
@model System.Collections.Generic.List@{ } @foreach(var person in Model) { }
- @person.last_name
在没有修改的情况下,我仍然可以使用我的api/values类型的URL来访问我的API,并且我可以通过Ajax调用API在初始服务器呈现之后刷新我的页面的一部分.