【问题标题】:lessons learned or mistakes made when using asp.net mvc使用 asp.net mvc 时的经验教训或错误
【发布时间】:2009-09-07 17:50:58
【问题描述】:

您在启动 asp.net mvc 时学到的最重要的经验教训是什么,您会向刚开始的人强调,以便他们避免这些错误?

【问题讨论】:

  • 任何使用 SO 的人都应该学习的一课是一些问题是 Wiki!
  • 推荐阅读:获取这篇关于 ASP.net MVC 中的模式和反模式的演示文稿:indomitablehef.com/?p=225

标签: asp.net-mvc


【解决方案1】:
  • 在您打印数据的任何地方都使用 Html.Encode(),除非您有充分的理由不这样做,因此您不必担心 XSS
  • 不要将路由硬编码到您的视图或 javascript 中 - 它们会在某些时候发生变化,请改用 Url.Action()
  • 不要害怕使用局部视图
  • MVC 不是灵丹妙药,首先要评估它是否确实是解决问题的最佳选择工具。

【讨论】:

    【解决方案2】:

    不要忘记模式的“单元测试”部分。

    【讨论】:

      【解决方案3】:

      尝试始终使用 ViewModel 在 Controller 和 View 之间传递数据。 你可能认为你不需要一个,你可以传递你的模型,但突然之间你需要一个列表框,其中包含几个用于编辑模型或显示消息(不是验证消息)的选项,然后你开始向 ViewData 添加项目,以魔术字符串为键,使应用程序更难维护。 您还可以使用 ViewModel 解决一些安全问题。 例如:

      class user:
      int id
      string name
      string email
      string username
      string password
      

      您的视图让用户更改他的姓名和电子邮件并发布到操作

      public ActionResult Edit(User user)
      {
      --persist data
      }
      

      有人可能会篡改您的表单并发布新的密码和用户名,您需要非常小心 DefaultBinder 的行为。 现在,如果您使用 ViewModel,例如:

      class userEditViewModel:
      int id
      string name
      string email
      

      问题消失了。

      【讨论】:

      • 为什么不排除操作过滤器中的“用户名”和“密码”?或者仅使用您要更新的字段列表来更新模型?
      • 这是完全有效的,但你可以忘记这样做,一些新开发者可能不知道这一点,因为不是那么明显。使用 ViewModels 几乎不可能失败。
      【解决方案4】:
      • 只要有可能让你的视图类型化

      • 在视图中避免逻辑

      • 远离 HttpContext

      【讨论】:

        【解决方案5】:
        1. 获取Steve Sandersons Pro ASP.NET MVC 框架

        2. 调试到Sourcecode

        【讨论】:

          【解决方案6】:
          • 如果您为单个参数方法创建一个参数名称与 id 不同的控制器方法,您必须创建一个新路由。硬着头皮用id(它不关心类型)并在cmets中解释。
          • 确保使用 RedirectToAction 命名参数:

            return RedirectToAction("DonateToCharity", new { id = 1000 });

          • You lose your ViewData when you RedirectToAction.

          【讨论】:

            【解决方案7】:

            将 javascript 放在单独的文件中,而不是放在视图页面中

            【讨论】:

            • 为什么?如果我需要在视图页面中分配 js 变量怎么办?即当前项目的 id 或一些生成的 url?我同意大多数 javascript(函数)应该在 *.js 文件中,但是您可以在 cshtml/ascx 中生成许多变量、本地化消息等(如果可能的话,都在一个部分视图中,这是布局的一部分)
            【解决方案8】:

            控制器名称:)

            单元测试模式

            【讨论】:

              【解决方案9】:

              不要使用 Forms 集合,使用模型绑定。

              尽量不要使用ViewData,创建一个ViewModel。

              如果您的视图中有循环或 if,请编写 HTML 帮助程序。

              善良,

              【讨论】:

                【解决方案10】:

                不要让你的控制器变胖,做太多的工作。过去我见过 1000 多个线路控制器,而了解正在发生的事情简直就是一场噩梦。

                对您的控制器使用单元测试,以确保控制依赖关系并且您的代码是可测试的。

                不要沉迷于让 jQuery 和花哨的客户端脚本定义应用程序的行为,尽量少用它,让它增强你的应用程序。

                尽可能使用部分视图和 HTML 帮助程序,以确保您的视图不会变得笨拙和维护噩梦。

                尽可能使用 ViewModel。

                使用依赖注入框架来处理你的依赖(MvcContrib 有几个控制器工厂,虽然它很简单,你可以自己滚动)。

                【讨论】:

                  【解决方案11】:

                  为您网站的每个部分(例如主页、帐户)使用不同的控制器

                  了解如何使用 ViewData 和 TempData

                  了解 RenderPartial 的用途

                  【讨论】:

                    猜你喜欢
                    • 2010-09-06
                    • 2012-06-26
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-07-18
                    • 1970-01-01
                    • 2011-04-04
                    • 2011-08-25
                    相关资源
                    最近更新 更多