我不能完全围绕asp.net核心MVC 2中的路由机制。
这就是我所拥有的:
我已经构建了一个功能页面,将'Materials'添加到'Application'中。
调用此页面的URL为:
http://localhost:33333/AddMaterial/Index/57
它使用默认路由:
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}"
);
其中57是应用程序ID,因此我知道“应用程序”获取新的“材料”。控制器中的索引方法如下所示,并按预期工作:
[HttpGet] public IActionResult Index(string id)
{
var model = GetModel(context, int.Parse(id));
return View("Index", model);
}
到目前为止一直很好...... 现在这是我的问题:
我想使用相同的控制器和视图来编辑'材料'。但为此我需要Index()中的两个参数。我需要:
string applicationId
string materialId
作为参数。
所以我添加了一条新路线:
routes.MapRoute(
name: "whatImTryingToAchieve",
template: "{controller}/{action}/{applicationId?}/{materialId?}"
);
当然我更新了控制器:
public IActionResult Index(string applicationiId, string materialId)
{
// Do stuff with materialId etc.
// ...
return View("Index", model);
}
我知道路由系统有特定的顺序。所以我尝试在默认路由之前定义我的新路由。那没用。 然后我尝试将它放在默认路由之后,这也不起作用。
我阅读了很多关于路由系统的信息,但我似乎没有找到我的简单问题的答案:
如何添加其他特定路线?
非常感谢帮助:)
编辑:基于属性的路由,如IgorsŠutovs所建议
控制器:
[Authorize(Roles = "Admins")]
[Route("AddMaterial")]
public class AddMaterialController : Controller
{
//....
[Route("AddMaterial/{applicationId}/{otherid}")] // Nope. Nothing.
[HttpGet] public IActionResult Index(string applicationId, string otherid)
{
return View();
}
[Route("AddMaterial/Index/{applicationId}")] // Didn't work.
[Route("AddMaterial/{applicationId}")] // Didn't work either...
[HttpGet] public IActionResult Index(string applicationId)
{
return View();
}
}
属性基础路由非常多。
答案 0 :(得分:2)
我将就所述问题的实质提出我的主观意见。这个问题似乎可以改为:"设计路由并使用多个参数解决此类情况的正确ASP.NET核心方法是什么?"
TLDR:使用Attribute-Based Routing
这是在ASP.MVC 5中添加的新类型的路由。从那时起旧的路由机制被认为是"传统的"。 ASP.NET Core目前允许混合两者。我将提供一个如何使用基于属性的路由解决所述问题的详细示例,因为新方法具有以下优点:
继续解决方案。我们假设我们有两个模型:应用程序和材料。我会创建2个不同的控制器来管理每个。从您的示例中,我了解这些域实体之间的关系是一对多的,例如一个应用程序可能有很多材料。这表明以下路线:
GET: applications/{applicationId}
GET: applications/{applicationId}/materials/{materialId}
......回顾Restful Routing的原则。
ApplicationController将如下所示:
[Route("applications")]
public class ApplicationController
{
[HttpGet("{applicationId}")]
public IActionResult Index(string applicationId)
{
// return your view
}
}
虽然MaterialController看起来像这样:
[Route("applications/{applicationId}/materials")]
public class MaterialController
{
[HttpGet("{materialId}")]
public IActionResult Index(string applicationId, string materialId)
{
// return your view
}
}
现在可以将Startup.cs的Configure方法中对UseMvc(..)扩展方法的调用简化为:
app.UseMvc();
希望你能发现它有用!