【问题标题】:ASP.Net MVC 3 RC2, Partial Views Form HandlingASP.Net MVC 3 RC2,部分视图表单处理
【发布时间】:2011-05-26 22:42:19
【问题描述】:

经过多年的 Web 表单开发,我决定尝试 MVC。我已经能够克服大多数其他绊脚石,但我有点卡在这个上面。

在 Web 表单中,我会为我的每个表单创建控件以实现模块化,这样我就可以在我的网站中重复使用它们。我试图在 MVC 中做同样的事情,但有部分观点并且运气不佳。这可能很简单,也许我只是没有搜索正确的关键字集来找到明显的例子。

假设我为登录表单创建了一个强类型的局部视图。我想将它包含在我网站的几个页面中。由于代码与视图是分开的,如何封装逻辑以便在多个视图中轻松重用?在 Web 表单中,我只是将其粘贴在代码隐藏中。在 MVC 中,我是否必须将代码放在要使用控件的每个视图控制器中?

其次,您如何处理来自部分视图的帖子?我尝试创建强类型视图和部分视图,但视图模型似乎不像表单直接在视图上时那样自动填充。我总是可以使用 FormCollection 作为动作参数,并且只是将值强制到我的局部视图模型中,但这似乎不太优雅。有人可以指出一些功能示例,说明如何在单个视图上使用多个带有表单的强类型部分页面(例如,带有登录控件和注册控件的登录页面)

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 partial-views razor


    【解决方案1】:

    在 MVC 中,您不应在视图中保留任何逻辑(仅查看位除外)。
    例如,我建议查看Fabrikam Shipping

    要保持视图干燥,您可以使用部分和编辑/视图模板。 要提交部分表单 - 您可以使用 jQuery AJAX(Hijax):

    $("#someForm").submit(function () {
                $.post($(this).attr("action"), $(this).serialize(),  
                      function (response) {
                           $("#someContainer").append(response);
                      });
                return false;
            });
    

    此外,如果您想将整个表单提交给其他操作或控制器,您可以使用以下内容:

    @using (Html.BeginForm("Action","Controller",FormMethod.Post,new{id="Form"}))
    

    【讨论】:

      【解决方案2】:

      将其放在Views\Helpers 文件夹中:

      @helper LoginControl() {
          @using (Html.BeginForm("Login","Home")) {
      
          }
      }
      

      并在您的视图或主人中使用它:

      <div>
          @LoginControl()
      </div>
      

      现在只需将其添加到您的 HomeController

      public ActionResult Login(LoginModel model)
      {
      }
      

      【讨论】:

      • 您确定Views\Helpers 有效吗?上次我与 ASP.NET MVC 团队核实了这一点,他们说尽管 Scott Gu 在他的博客中宣传了这个功能,但不会实现此功能。
      • 哦。不知道。我只是从博客中记起来的。
      • 我想创建一个 Html 助手是要走的路,让它保持干燥。
      【解决方案3】:

      对于 MVC3 中的 Razor 助手,我们没有真正干净的解决方案。在常规网站中,您可以将 CSHTML 或 VBHTML 文件放在 App_Code 中,然后使用 jgauffin 建议的语法。不幸的是,我们无法实现他提到的 ~/Views/Helpers 模型,因为我们的编译系统存在一些我们无法克服 v1 的限制(我们正在调查 v2)。

      ASP.Net 团队的架构师 David Ebbo 提出了一个使用 Visual Studio 代码生成器的解决方案,因此您可以将帮助程序编译成任何 dll(甚至是常规类库):http://blogs.msdn.com/b/davidebb/archive/2010/10/27/turn-your-razor-helpers-into-reusable-libraries.aspx。我强烈建议检查一下

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-03
        • 2012-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-03
        相关资源
        最近更新 更多