Phi*_*hil 9 asp.net-mvc refactoring magic-string
我有桌面软件开发的背景,我开始学习ASP.NET MVC.
在我的默认HomeController中,我有Index动作,其代码如下所示:
if (!Request.IsAuthenticated)
    return RedirectToAction("Login", "Account");
换句话说,将用户重定向到"/ account/login".然后,AccountController.Login操作将处理用户并在他成功登录后将其发送回HomeController.
这段代码对我来说很有趣,也许只是因为我习惯于在桌面软件中做不同的事情.如果我将登录操作的名称更改为"LogOn"怎么办?如果我完全删除AccountController并用其他东西替换它会怎么样?我将介绍一个新的bug,但我不会遇到编译器错误,我的单元测试可能也不会捕获它.由于我使用字符串来指定控制器和动作名称,因此重构和重新设计更有可能在整个地方破坏代码.
我想要的是这样的:
if (!Request.IsAuthenticated)
    return RedirectToAction(() => AccountController.Login);
但是我不确定这是否可能,或者它是否是最好的方法.
我是愚蠢的,还是有其他人有同样的问题?你怎么做才能绕过它?
Rus*_*Cam 20
我认为你正在寻找的是T4MVC存在的原因- 它删除了与控制器和动作相关的所有"魔术字符串",并用类和属性替换它们.
有了T4MVC,这个
if (!Request.IsAuthenticated)
    return RedirectToAction("Login", "Account");
变成了这个
if (!Request.IsAuthenticated)
    return RedirectToAction(MVC.Account.Login());
有一个标志可以在T4MVC设置中设置,以强制它在每个构建上运行模板,在事情可能发生变化时提供预警.
虽然不是您提出的要求,但您可以考虑使用AuthorizeAttribute以删除检查请求是否在控制器操作内进行身份验证的需要.
这个
public class HomeController : Controller
{
    public ActionResult Index() 
    {
        if (!Request.IsAuthenticated)
            return RedirectToAction("Login", "Account"); 
        // .... carry on
    }
}
变
public class HomeController : Controller
{
    [Authorize]
    public ActionResult Index() 
    {
        // .... carry on
    }
}
然后web.config,将URL设置为指向帐户登录URL
<authentication mode="Forms">
   <forms loginUrl="account/login" timeout="30" />
</authentication> 
当然,如果您的控制器和操作发生变化(类似于您的原始投诉),这并不会给您带来任何安全性,但您始终可以设置路由以将所选URL指向正确的控制器和操作,并使用T4MVC生成的类路线,如果事情发生变化,为您提供一些编译时警告.
在C#6中,您可以利用nameof许多魔术字符串并轻松地对其进行重构。
... = new SelectList(context.Set<User>(), nameof(User.UserId), nameof(User.UserName));
...
return RedirectToAction(nameof(Index));
| 归档时间: | 
 | 
| 查看次数: | 3190 次 | 
| 最近记录: |