ASP.NET MVC - Response.Write代码 - 将它放在Controller,SingleFile或CodeBehind中

时间:2009-02-05 00:01:34

标签: .net asp.net-mvc

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

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

2 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:4)

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

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

另一种选择是将它变成ViewUserControl - 你可以传递Model和ViewData。您仍然可以通过视图添加此内容。

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

修改

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

+-Project.Web
 +-Content
 +-Controllers
 +-Models
 +-Views
  +-...
  +-Shared
   +-Error.aspx
   +-GoogleVisControl.ascx
   +-LoginUserControl.ascx
   +-Site.Master
   +-...
  +-...
 +-...
+-Project.Common
+-Project.Common.Web
 +-HtmlHelperExtensions.cs
 +-...
+-Project.Data
 +...