关于在Asp.net Core MVC 2中路由的问题

时间:2017-11-15 08:30:26

标签: c# asp.net-core routing

我不能完全围绕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(); 
    }
}

属性基础路由非常多。

1 个答案:

答案 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();

希望你能发现它有用!