我创建了以下代码来尝试删除与MVC Action名称相关的任何魔术字符串。潜在的dev可以改变访问mutator并在页面中访问它。
private const string IndexAction = "Index";
public ActionResult Index(){
//do stuff
}
public ActionResult Other(){
// do stuff
if(foo)
return RedirectToAction(IndexAction);
//don't foo
}
我从来没有见过这个让我觉得这不是一个好主意,在编程世界中我怀疑我是第一个尝试这个的人。 问题:将动作的名称设置为不良实践是否会破坏MVC的任何主体。
答案 0 :(得分:3)
基本上使用常量是个好主意(虽然根据我的经验,它在MVC中并不常见 - 如果你的控制器很小,也可能不需要)。顺便提一下,你可以减少必须从几个变为两个的点数。
如果您想将其缩小到一个位置,您还可以使用ActionName - 属性通过使用常量来指定操作的名称。这打破了MVC中使用的约定,因此其他人可能需要更长时间来理解系统,但有一个优点是将更改限制在一个位置:
private const string IndexAction = "Index";
[ActionName(IndexAction)]
public ActionResult Index(){
//do stuff
}
public ActionResult Other(){
// do stuff
if(foo)
return RedirectToAction(IndexAction);
//don't foo
}
有关ActionName属性及其用途的详细信息,请参阅此question及其答案。
答案 1 :(得分:1)
有时做的是在给定的控制器中创建带有动作名称的枚举 像这样:
public class HomeController : Controller
{
public enum Actions
{
Index,
About,
Contact,
Hosting,
Hartware
}
我创建一个Extension方法并使用与我想要扩展的原始类相同的命名空间,在这种情况下,我将使用System.Web.Mvc并创建以下类
namespace System.Web.Mvc
{
public static class MvcExtentions
{
/// <summary>
/// Generates a fully qualified URL to an action method by using the specified action Name.
/// </summary>
/// <param name="sender">used for the generate the logic</param>
/// <param name="actionName">an enum that will be used to generate the name from</param>
/// <returns>a fully qualified url to the action in the current controller</returns>
public static string Action(this UrlHelper sender, Enum actionName)
{
return sender.Action(actionName.ToString());
}
}
}
然后在我的Razor ViewPage中添加使用来获取本案例&#34; HomeController&#34;在我的页面顶部,ByteStream是我的项目的名称
@using ByteStream.Web.Controllers
@{
ViewData["Title"] = "Home Page";
}
要生成链接,请使用
<a class="btn btn-default btn-default" ref="@Url.Action(HomeController.Actions.Hosting))">
Learn More
</a>