C# 在MVC中对控制器、视图和操作名称进行硬编码是否是一种良好的做法?

C# 在MVC中对控制器、视图和操作名称进行硬编码是否是一种良好的做法?,c#,.net,asp.net-mvc,C#,.net,Asp.net Mvc,查看MVC代码时,您经常会遇到如下代码片段: return RedirectToAction("Index"); <li>@Html.ActionLink("Books", "Index", "Books")</li> 返回重定向到操作(“索引”); @ActionLink(“书籍”、“索引”、“书籍”) 其中控制器名称、控制器操作名称或视图名称作为硬编码字符串提供。这是一种常见的做法,但这是一种好的做法吗?毕竟,如果您重命名控制器,并且忘记重命名许多引用中的一个,

查看MVC代码时,您经常会遇到如下代码片段:

return RedirectToAction("Index");

<li>@Html.ActionLink("Books", "Index", "Books")</li>
返回重定向到操作(“索引”);
  • @ActionLink(“书籍”、“索引”、“书籍”)
  • 其中控制器名称、控制器操作名称或视图名称作为硬编码字符串提供。这是一种常见的做法,但这是一种好的做法吗?毕竟,如果您重命名控制器,并且忘记重命名许多引用中的一个,您将得到一个运行时错误,而不是更喜欢的编译时错误

    您可能会通过向BaseController添加静态名称属性来缓解这个问题,然后按如下方式使用代码(操作名称将稍微难以实现)

  • @Html.ActionLink(“图书”,“索引”,BooksController.Name)

  • 那么,这种硬编码是否应该被视为一种较小的邪恶(相对于不使用MVC而言)。还是人们开发了一些实践来解决这个问题?

    我们本能地知道字符串文字是一件坏事,所以你本能地将“Books”设为常量通常是好的。其想法是将字符串放在一个位置,因此当您需要将“书籍”更改为“产品”时,例如,您只需在一个位置更改它

    然而,在这样做的过程中,你正在弄乱那些可以帮助你解决问题的工具。我刚刚使用Resharper将“HomeController”重命名为“BananaController”,它会自动将
    @Html.ActionLink(…“Home”)
    的每个引用更新为
    @Html.ActionLink(…“Banana”)


    我不知道VS是否会在没有Resharper的情况下做到这一点。有人告诉我,VS在重构方面每年都在进步,但我并没有和任何没有Resharper的人一起工作…

    你正在寻找的,它会生成字符串常量的强类型类。

    从未遇到过出现这种情况,但是我喜欢这个变通方法,如果它真的出现,我会使用它。你正在寻找T4MVC。真的。刚刚看了视频。你想回答吗?@Slaks:请回答。我会接受的。是的,R#相当聪明。我也喜欢这样,当我可以通过单击这些字符串文本导航到代码时。不过我觉得这些文字应该是不必要的。如果你想像在教科书和示例应用程序中阅读一样,那么我会把它们作为字符串保留。@SLaks提到的T4MVC看起来是一个很好的下一步。我正在考虑如何将我的MVC呈现从服务器转移到客户端,并完全去除这些字符串,但我想我仍然需要它们来构建JSON。我要检查T4MVC=)
    <li>@Html.ActionLink("Books", "Index", BooksController.Name)</li>