ASP.NET MVC 中的魔术字符串

2024-05-02

我有桌面软件开发背景,并且正在开始学习 ASP.NET MVC。

在我的默认 HomeController 中,我有 Index 操作,其代码如下所示:

if (!Request.IsAuthenticated)
    return RedirectToAction("Login", "Account");

换句话说,将用户重定向到“/account/login”。然后,AccountController.Login 操作将处理用户,并在用户成功登录后将其发送回 HomeController。

这段代码对我来说很奇怪,也许只是因为我习惯在桌面软件中以不同的方式做事。如果我将登录操作的名称更改为“LogOn”会怎么样?如果我完全删除 AccountController 并用其他东西替换它会怎么样?我将引入一个新的错误,但不会出现编译器错误,并且我的单元测试可能也不会捕获它。由于我使用字符串来指定控制器和操作名称,因此重构和重新设计更有可能破坏整个地方的代码。

我想要的是这样的:

if (!Request.IsAuthenticated)
    return RedirectToAction(() => AccountController.Login);

但是我不确定这是否可能,或者这是否是最好的方法。

是我太笨了,还是其他人也有同样的问题?你会做什么来解决这个问题?


我认为你正在寻找的就是原因T4MVC http://t4mvc.codeplex.com/存在 - 它删除了与控制器和操作相关的所有“魔术字符串”,并将它们替换为类和属性。

使用 T4MVC,这

if (!Request.IsAuthenticated)
    return RedirectToAction("Login", "Account");

变成这个

if (!Request.IsAuthenticated)
    return RedirectToAction(MVC.Account.Login());

可以在 T4MVC 设置中设置一个标志,以强制它在每个构建上运行模板,从而在某些内容可能发生更改时向您发出早期警告。

虽然不是您所要求的,但您可以考虑使用AuthorizeAttribute http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx无需检查请求是否在控制器操作内经过身份验证。

this

public class HomeController : Controller
{
    public ActionResult Index() 
    {
        if (!Request.IsAuthenticated)
            return RedirectToAction("Login", "Account"); 

        // .... carry on
    }
}

becomes

public class HomeController : Controller
{
    [Authorize]
    public ActionResult Index() 
    {
        // .... carry on
    }
}

then in web.config,设置url指向账户登录URL

<authentication mode="Forms">
   <forms loginUrl="account/login" timeout="30" />
</authentication> 

当然,如果您的控制器和操作发生变化(类似于您最初的投诉),这不会给您带来任何安全,但您始终可以设置一个路由,将所选的 URL 定向到正确的控制器和操作,并使用 T4MVC 生成的类路线,如果情况发生变化,会向您提供一些编译时警告。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET MVC 中的魔术字符串 的相关文章

随机推荐

  • 如何有效地合并两个 BST?

    如何合并两个二叉搜索树并保持BST的性质 如果我们决定从树中取出每个元素并将其插入到另一个元素中 则此方法的复杂度将为O n1 log n2 where n1是树的节点数 比如T1 我们已经拆分了 并且n2是另一棵树的节点数 比如T2 执行
  • 模拟导入失败

    我该如何制作import pkg失败moduleA py 我可以打补丁pkg如果从中导入某些内容则会失败 否则不会失败 test py import os import moduleA from unittest mock import p
  • 如何处理错误“方法‘First’只能用作最终查询操作”

    我想按关系从数据库中的不同表中检索数据 但出现错误 我不知道如何处理 int customer id int Parse this comboBoxnamecustomer SelectedValue ToString a from c i
  • 将 .cer 格式的证书添加到 .bks 密钥库中

    我需要将 cer 格式的证书添加到 BKS 密钥存储中 SO 上对此进行了描述 如何将 cer 转换为 BKS https stackoverflow com questions 21284466 how to convert cer to
  • SQLPLUS 保存到文件

    我必须为我的数据库类使用 SQLPLUS 我们的第一个作业是简单的保存 我按照说明进行操作 我正在使用 PuTTY 访问 sqlplus 在本练习中使用以下 SQL 命令 并尝试使用 SAVE 和 SPOOL 命令将 SQL 命令和输出保存
  • ActionScript 3.0 中缺少运算符重载

    我在 ActionScript 中最怀念的事情之一是缺少运算符重载 特别是 我通过在我的类中添加 Compare 方法来解决这个问题 但这在很多情况下没有帮助 比如当你想使用内置字典之类的东西时 有没有好的方法来解决这个问题 Nope 但添
  • 如何使用Query备份MySQL数据库?

    我们如何使用 Query 备份 MySQL 数据库 就像我们可以使用以下 Query 备份 MS SQL 一样 Query backup database DATABASENAME to disk PATH 使用 mysqldump php
  • OpenCV 在使用 anaconda 的 Linux 上无法与 python 正常工作。收到 cv2.imshow() 未实现的错误

    这就是我得到的确切错误 我的操作系统是 Ubuntu 16 10 OpenCV 错误 未指定错误 该功能未实现 使用 Windows GTK 2 x 或 Carbon 支持重新构建库 如果您使用的是 Ubuntu 或 Debian 请安装
  • 发送到带有联系表格 asp.net 的电子邮件

    我如何使用 ASP NET 中的联系表单向指定的电子邮件地址发送电子邮件 该网站通过托管公司托管 谢谢 MailMessage mail new MailMessage SmtpClient SmtpServer new SmtpClien
  • 将 SelectByText (部分)与 C# Selenium WebDriver 绑定一起使用似乎不起作用

    我正在使用 C 中的 Selenium WebDriver 扩展通过部分文本值 实际前面有一个空格 从选择列表中选择一个值 我无法使用部分文本匹配来使其工作 我做错了什么还是这是一个错误 可重现的例子 using Microsoft Vis
  • 连接系统 R 中的两个或多个数据帧

    我的问题是如何在 R 系统中连接两个或多个数据帧 例如 我有两个数据框 first x y z 1 3 2 4 2 4 5 7 3 5 6 8 second x y z 1 1 1 1 2 4 5 7 我需要这个 x y z 1 3 2 4
  • 如何解析 Spray-routing 中的 get 请求参数?

    这就是代码部分的样子 get respondWithMediaType MediaTypes application json entity as HttpRequest obj gt complete println obj ok 我可以
  • Android MediaCodec 在异步模式下比同步模式下慢?

    再次 我有一个关于 Android 的 MediaCodec 类的问题 我已成功解码原始 h264 内容并将结果显示在两个纹理视图中 h264 流来自运行 openGL 场景的服务器 该场景有一个摄像头 因此可以响应用户输入 为了进一步减少
  • parseInt() 和 Number() 有什么区别?

    How do parseInt https developer mozilla org en US docs Web JavaScript Reference Global Objects parseInt and Number https
  • SQL Server 与 MySQL:CONTAINS(*,'FORMSOF(THESAURUS,word)')

    我很震惊 当我在 SQL Server 中看到查询非常简单时 我花了 3 4 天弄清楚如何在 mysql 中实现词干提取 和同义词搜索 Select from tab where CONTAINS FORMSOF THESAURUS wor
  • 错误:此 PlotModel 已被其他 PlotView 控件使用

    我有两个选项卡绑定到一个viewmodel其中包含一个PlotModel of oxyplot并查看通过选择的模型DataTemplate 当单击第一个选项卡时viewmodel已正确绑定 但当切换到标题中定义的上面第二个选项卡时 会抛出异
  • 将 pandas DataFrame 与 Series 进行比较

    我看过this https stackoverflow com questions 26285661 working with comparing dataframes and series and generating new dataf
  • 如何使用 React 传递自定义服务器主机名?

    我希望能够在运行 React 应用程序时传递自定义服务器主机名 以便在需要获取数据时在 URL 中使用 服务器当前正在我的本地计算机上运行 因此当我使用获取 我一直在使用 http localhost 效果非常好 但我希望能够传递要在 UR
  • 这个作用域/闭包什么时候在 javaScript 中被垃圾回收?

    我正在做一门课程 该课程正在讨论范围 闭包并简要提到垃圾收集 课程中提出一个问题 范围保持多久 答案是 直到 不再有任何提及它 是的 所以我们基本上说的是 是的 闭包有点像对隐藏范围对象的引用 所以只要有一些函数仍然有一个闭包 范围 该范围
  • ASP.NET MVC 中的魔术字符串

    我有桌面软件开发背景 并且正在开始学习 ASP NET MVC 在我的默认 HomeController 中 我有 Index 操作 其代码如下所示 if Request IsAuthenticated return RedirectToA