C# 路由到angular2/.net核心中的特定id

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,

我无法使Angular2/.Net Core中的路由正常工作

我已经用Angular启动了一个默认的.Net核心web项目,并成功地用适用的视图组件创建了一个新的控制器。该页面的目的是显示文档列表,并提供单击标题以在单独视图中查看每个文档的选项

只要一切正常,它就会显示页面的内容,我还可以显示从数据库检索到的文档列表。路由如下所示:

@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?}");
});