我很难在MVC Core中绕过自定义路由。 我知道我需要在Startup中添加一些内容
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
但我怎么能让控制器正常运行? 我基本上需要一个数据详细信息视图来使用字符串而不是id。 所以" string url"而不是" int id"。
我在线阅读了一些文章,但我尝试的所有内容似乎都失败了。 提前谢谢。
答案 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*/
});
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
如果您需要的是路由规则:
您可以修改默认规则以接受id参数中的字符串,并继续使用接受' id'
添加另一个接受另一个参数的规则,例如' code'或者适合使用字符串研究键的方法的东西。一个 nd在各个级别上自定义新绑定(如所有控制器\操作的默认值,对于单个控制器,...)
您也可以使用控制器中的C#属性添加该自定义规则。 (PROS:你有方法规则,所以对于rembember很有用,你可以在另一个项目中导入控制器及其所有路由规则。缺点:大型项目可能很难理解如何交互规则全部分布在各种文件)。