MVC动作命名为常量字符串?

时间:2014-02-25 09:59:17

标签: c# asp.net-mvc

我创建了以下代码来尝试删除与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的任何主体。

2 个答案:

答案 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>