MVC核心自定义路由

时间:2016-01-29 20:55:35

标签: c# asp.net asp.net-mvc asp.net-core-mvc

我很难在MVC Core中绕过自定义路由。 我知道我需要在Startup中添加一些内容

app.UseMvc(routes =>
{
    routes.MapRoute(
       name: "default",
       template: "{controller=Home}/{action=Index}/{id?}");
});

但我怎么能让控制器正常运行? 我基本上需要一个数据详细信息视图来使用字符串而不是id。 所以" string url"而不是" int id"。

我在线阅读了一些文章,但我尝试的所有内容似乎都失败了。 提前谢谢。

3 个答案:

答案 0 :(得分:1)

通过添加路由约束,告诉你的代码,你应该没问题,id将是一个字符串(word);

app.UseMvc(routes =>
{
    routes.MapRoute(
       name: "default",
       template: "{controller=Home}/{action=Index}/{id}",
       defaults: null,
       constraints: new {Id = @"\w+" }); /* \d+ limits to only digits*/
});

参考:http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/creating-a-route-constraint-cs

Alternativley你可以使用AttributeRouting并用适当的Route()注释装饰你的控制器和动作方法:

[Route("api/[controller]")]
public class HomeController : Controller
{
    [Route("[action]/{name}")]
    public string GetSomething(string name)
    {
        return foo;
    }
}

答案 1 :(得分:0)

MVC Core的正确解决方案是添加约束,如下所示:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}", 
        defaults: null,
        constraints: new { id = @"\w+" }); /* \d+ limits to only digits*/
});

为了防止编译错误发生,您需要提供defaults的值(在本例中为null),并且它应该是constraints,而不是constraint 。为了防止可能发生的问题,您还应该注意用于id参数的情况。

答案 2 :(得分:0)

  

但我怎么能让控制器正常运行?

我只想强调这只是各种选择中的一种。 当你想要美化网址并管理网址中的第三个斜杠时,会使用路由。当url可见时,这是最好的选项,但请记住,如果你正在使用ajax,你可以直接使用没有路由规则的查询字符串:controller / action?id = hello

如果您需要的是路由规则:

  1. 您可以修改默认规则以接受id参数中的字符串,并继续使用接受' id'

  2. 的方法。
  3. 添加另一个接受另一个参数的规则,例如' code'或者适合使用字符串研究键的方法的东西。一个 nd在各个级别上自定义新绑定(如所有控制器\操作的默认值,对于单个控制器,...)

  4. 您也可以使用控制器中的C#属性添加该自定义规则。 (PROS:你有方法规则,所以对于rembember很有用,你可以在另一个项目中导入控制器及其所有路由规则。缺点:大型项目可能很难理解如何交互规则全部分布在各种文件)。