C# 路由到angular2/.net核心中的特定id
我无法使Angular2/.Net Core中的路由正常工作 我已经用Angular启动了一个默认的.Net核心web项目,并成功地用适用的视图组件创建了一个新的控制器。该页面的目的是显示文档列表,并提供单击标题以在单独视图中查看每个文档的选项 只要一切正常,它就会显示页面的内容,我还可以显示从数据库检索到的文档列表。路由如下所示:C# 路由到angular2/.net核心中的特定id,c#,routes,angular2-routing,asp.net-mvc-routing,asp.net-core-2.0,C#,Routes,Angular2 Routing,Asp.net Mvc Routing,Asp.net Core 2.0,我无法使Angular2/.Net Core中的路由正常工作 我已经用Angular启动了一个默认的.Net核心web项目,并成功地用适用的视图组件创建了一个新的控制器。该页面的目的是显示文档列表,并提供单击标题以在单独视图中查看每个文档的选项 只要一切正常,它就会显示页面的内容,我还可以显示从数据库检索到的文档列表。路由如下所示: @NgModule({ declarations: [ AppComponent, NavMenuComponent,
@NgModule({
declarations: [
AppComponent,
NavMenuComponent,
DocumentsComponent,
HomeComponent
],
imports: [
CommonModule,
HttpModule,
FormsModule,
RouterModule.forRoot([
{ path: '', redirectTo: 'home', pathMatch: 'full' },
{ path: 'home', component: HomeComponent },
{ path: 'documents', component: DocumentsComponent },
{ path: '**', redirectTo: 'home' }
])
]
})
export class AppModuleShared {
}
我在每个文档上都有一个链接,因此当您单击它时,您将从列表/documents
转移到例如/documents/1
当我点击一个链接时,它只会在那里停留足够长的时间,这样我就可以看到URL的变化,然后它就会转到默认的回退/home
在Startup.cs中,我设置了默认路由处理:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapSpaFallbackRoute(
name: "spa-fallback",
defaults: new { controller = "Home", action = "Index" });
});
据我所知,“默认”地图路线应该选择/documents/1
,但它没有。我甚至从未使用过路由的后端方法
[Produces("application/json")]
[Route("api/[controller]")]
public class DocumentsController : Controller
{
private readonly DatabaseContext _context;
public DocumentsController(DatabaseContext context)
{
_context = context;
}
// GET: api/Documents
[HttpGet]
public IActionResult GetDocuments()
{
// returns a JSON list of documents, works fine
}
// GET: api/Documents/5
[HttpGet("{id}")]
public async Task<IActionResult> GetDocument([FromRoute] int id)
{
//returns the specified document, is never even called
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var document = await _context.Documents.SingleOrDefaultAsync(m => m.Id == id);
if (document == null)
{
return NotFound();
}
return Ok(document);
}
[产生(“应用程序/json”)]
[路由(“api/[控制器]”)]
公共类文档控制器:控制器
{
私有只读数据库上下文\u上下文;
公共文档控制器(DatabaseContext上下文)
{
_上下文=上下文;
}
//获取:api/文档
[HttpGet]
public IActionResult GetDocuments()
{
//返回文档的JSON列表,工作正常
}
//获取:api/Documents/5
[HttpGet(“{id}”)]
公共异步任务GetDocument([FromRoute]int id)
{
//返回指定的文档,甚至从未调用
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
var document=wait_context.Documents.SingleOrDefaultAsync(m=>m.Id==Id);
if(document==null)
{
返回NotFound();
}
返回Ok(文件);
}
我需要做什么才能使特定的路由正常工作?您需要告诉角路由器,路径的
文档部分之后还有更多内容。它正在查找与路由/documents/1
匹配的组件,但找不到它。如果您将/:id
添加到路径,则应该允许它映射第二个pa将url重定向到路由,而不是重定向到home
{ path: 'documents/:id', component: DocumentsComponent },
据我所知,“默认”地图路线应该选择/documents/1
,但它没有
否。默认路由未按此方式配置。必须提供操作方法名称作为第二个参数,以匹配默认路由
/documents/getdocument/1
也就是说,它不会工作。当您添加属性路由时,它会自动阻止上述路由
因此,访问DocumentsController.GetDocument(int)
的唯一URL是:
/api/documents/1
这是因为您正在控制器上定义[Route(“api/[controller]””)
,这使得控制器中的每个操作都以这种方式作为前缀
如果希望/documents/1
作为URL并使用属性路由,可以使用:
[Produces("application/json")]
[Route("documents")]
public class DocumentsController : Controller
{
private readonly DatabaseContext _context;
public DocumentsController(DatabaseContext context)
{
_context = context;
}
// GET: api/Documents
[HttpGet(Order = 2)]
public IActionResult GetDocuments()
{
// returns a JSON list of documents, works fine
}
// GET: api/Documents/5
[HttpGet("{id}", Order = 1)]
public async Task<IActionResult> GetDocument([FromRoute] int id)
{
//returns the specified document, is never even called
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var document = await _context.Documents.SingleOrDefaultAsync(m => m.Id == id);
if (document == null)
{
return NotFound();
}
return Ok(document);
}
}
您需要为文档/id定义路由器
app.UseMvc(routes =>
{
routes.MapRoute(
name: "documents",
template: "documents/{id?}",
defaults: new { controller = "Documents", action = "GetDocuments" });
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});