【问题标题】:ASP.NET MVC - Response.Write code - put it in the Controller, SingleFile or CodeBehindASP.NET MVC - Response.Write 代码 - 将其放入 Controller、SingleFile 或 CodeBehind
【发布时间】:2009-02-05 00:01:33
【问题描述】:

如果您要在最后一刻将页面生成为字符串并通过 Response.Write 输出所有内容,您应该将这段代码放在哪里?

我需要能够动态地向客户端编写一堆 JavaScript 以使用一些新的 Google 可视化 jsapi。我注意到 MVC 框架的最新版本“不鼓励”视图上的 CodeBehinds。这真的是演示代码。它应该去哪里?这里首选的方法是什么...我从来都不是“SingleFile”的粉丝。

【问题讨论】:

    标签: .net asp.net-mvc


    【解决方案1】:

    您还可以使用ActionResult 类型Content 将纯字符串返回给浏​​览器。

    public ActionResult myAction() {
        Return Content("Hello World!");
    }
    

    但是,我不确定这是否是返回 JavaScript 时的最佳方法。您可能需要考虑编写自己的 JavaScriptResult 来继承 ActionResult

    【讨论】:

      【解决方案2】:

      代码是否可参数化?那就是你可以通过一些小的参数集来控制一个调用和另一个调用之间的差异吗?如果是这样,那么我会考虑编写一个 HtmlHelper 扩展来生成它。然后我会在我的视图中使用扩展来生成代码。如果无法从 Model 或 RouteValues 派生参数,则通过控制器的 ViewData 将参数传递给 View。

      <%= Html.GenerateGoogleVisAPI( ViewData["someThing"],
                                     ViewData["otherThing"] ) %>
      

      另一种选择是将它变成一个 ViewUserControl——您可以将模型和 ViewData 传递给它。您仍然可以通过视图包含此内容。

      <% Html.RenderPartial( "GoogleVisControl",
                             ViewData["GoogleVisModel"],
                             ViewData ); %>
      

      编辑

      我的 HtmlHelperExtensions 通常放在一个单独的类库项目中。所以我的层次结构看起来像下面这样。请注意,为了简洁起见,我省略了每个级别的相关测试项目,但它们也会在那里。如果您有多个应用程序使用相同的数据层,则数据层可能完全存在于单独的解决方案中,具体取决于您是每个应用程序有一个解决方案还是每个解决方案有多个应用程序。我将项目引用添加到类库项目的 Web 项目中。

      +-Project.Web +-内容 +-控制器 +-型号 +-视图 +-... +-共享 +-错误.aspx +-GoogleVisControl.ascx +-LoginUserControl.ascx +-Site.Master +-... +-... +-... +-Project.Common +-Project.Common.Web +-HtmlHelperExtensions.cs +-... +-项目.数据 +...

      【讨论】:

      • 由于 Javascript 是视图的一个组件,我将使用 tvanfosson 建议的辅助方法。
      • 首先想到的是,HtmlHelper 扩展的代码放在哪里。您能否编辑您的答案以包括这些在项目层次结构中的位置。而且我想我会说“不”,这些东西是不可参数化的。这一切都基于来自 ADO.NET DataTable 的大量数据。
      • 第二,如果我将 this 变成 UserControl (.ascx),我应该使用 CodeBehind 吗?我注意到它“鼓励”我使用 SingleFile 设计......但甚至没有,因为它甚至没有放入 Page_Load 存根
      • 所以我认为我决定使用 UserControl.ascx。它里面使用了一个标准的 html 表(但添加了 runat="server")。这应该允许我 DataBind 到它。我从 NH/Castle Active Record 传入 List。 DataBind() 调用应该去哪里? CodeBehind 还是 SingleFile?
      • 为什么不在控制器中进行查询并将结果传递给 ViewData,然后将其传递给 ViewUserControl 作为表的模型?
      猜你喜欢
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多