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消费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。
| 归档时间: |
|
| 查看次数: |
2213 次 |
| 最近记录: |