是否有支持JavaScript视图的ASP.NETMVC视图引擎?

是否有支持JavaScript视图的ASP.NETMVC视图引擎?,javascript,asp.net-mvc,viewengine,Javascript,Asp.net Mvc,Viewengine,我想在ASP.NETMVC的服务器端生成一些JavaScript。是否有支持此功能的视图引擎?理想情况下,我希望能够从url获取JavaScript,如: http://myapp/controller/action.js 我看过MonoRail项目,他们似乎有这个功能,但文档非常缺乏,我找不到ASP.NETMVC的任何端口 编辑:这样做的目的是通过使用如下url将页面呈现为标准HTML: http://myapp/controller/action 并使用问题中的第一个url作为js(特别

我想在ASP.NETMVC的服务器端生成一些JavaScript。是否有支持此功能的视图引擎?理想情况下,我希望能够从url获取JavaScript,如:

http://myapp/controller/action.js
我看过MonoRail项目,他们似乎有这个功能,但文档非常缺乏,我找不到ASP.NETMVC的任何端口

编辑:这样做的目的是通过使用如下url将页面呈现为标准HTML:

http://myapp/controller/action
并使用问题中的第一个url作为js(特别是ExtJS组件)。控制器中只有一个操作,但有两个视图:一个用于HTML,一个用于JS


编辑2:我基本上希望获得与CakePHP相同的结果。

我必须做一些非常类似的事情,我使用了来自的nvelocity视图引擎-从技术上讲,您可以使用默认的aspx视图引擎,但我发现nvelocity语法对于输出脚本来说要简单得多(如果你以前没用过,别担心——我花了大约10分钟才弄明白!)

然后,您只需要向route表添加一个路由,以处理将您的.jsURL定向到操作的操作

编辑

无法验证这一点,因为我手头没有visual studio,但对于路线,您可能有以下内容:

RouteTable.Routes.Add(new Route
{
   Url = "[controller]/[action].js",
   Defaults = new { controller="home", requestType="javascript" }, // Whatever...
   RouteHandler = typeof(MvcRouteHandler)
});

RouteTable.Routes.Add(new Route
{
   Url = "[controller]/[action]",
   Defaults = new { controller="home"}, // Whatever...
   RouteHandler = typeof(MvcRouteHandler)
});
以.js结尾的请求应该通过第一条路径-无扩展请求通过第二条路径

然后,您的操作可以具有requestType参数:

public ActionResult MyAction (RequestType requestType)
{
  if(requestType == RequestType.JavaScript)
  {
     ... new nvelocity view to render javascript
  }
  else
  {
     ... 
  }
}

至于目录结构,这是你自己决定的!不是因为我不想帮你,而是因为你可以灵活地处理它!

你不一定需要查看引擎,只需返回纯文本结果即可

下面是我用来在javascript对象中呈现一些用户文化设置的控制器(单轨):

[ControllerDetails("js")]
public class JavascriptController : Controller
{
    private ISessionContext sessionContext;

    public JavascriptController(ISessionContext sessionContext)
    {
        this.sessionContext = sessionContext;
    }

    public void CultureInfo()
    {
        var scriptformat = @"var cultureInfo = {0};";
        var json = Context.Services.JSONSerializer.Serialize(getJSONiZableCultureInfo(sessionContext.CurrentCulture));
        RenderText(String.Format(scriptformat, json));
    }

    object getJSONiZableCultureInfo(System.Globalization.CultureInfo  culture)
    {
        return new
                        {   // add more there
                            culture.NumberFormat
                        };
    }
}
对于原始文本呈现会发出气味的更复杂的事情,任何视图引擎都可以工作


此外,您也不必使用.js扩展名将url放入脚本标记中。

如果您只想基于ViewData生成javascript,您可以创建自己的自定义结果。这是一个示例。

基于您的编辑,我将尝试一个新的答案,因为您需要ExtJS的json数据。我刚刚在我正在构建的应用程序中对它进行了测试,并成功了很好。首先你需要两条路线

{controller}/{action}.{format}

{controller}/{action}
现在控制器类有一个Json方法来序列化您想要的任何对象,它是一个JsonResult,因此您可以使用:

public ActionResult List(string format) {

    // logic here

    if (string.IsNullOrEmpty(format)) {
        return View();
    } else if (format == "js") {
        return Json(object_to_serialize);
    }

}

我想扩展这个想法,不仅允许Javascript视图,而且或多或少允许任何类型的文档。要使用它,只需将*.js URL的视图放在控制器视图文件夹的子文件夹中:

\Views
+-\MyController
  +-\js
  | +-Index.aspx <- This view will get rendered if you request /MyController/Index.js
  +-Index.aspx
\Views
+-\霉菌控制者
+-\js

|+-Index.aspx2007年7月的ASP.NET Futures发行版有一个新的托管JScript(我找不到新的)。我已经成功地解决了这个问题—但是请注意,您可能会被迫做一些额外的工作,JScript的.aspx解析是无法用的错误


您能否举例说明我可以使用的路径,以及可能的目录结构?这是一个好主意。我基本上将其抽象到了viewengine级别,以使其对控制器透明。关于扩展:我知道,但使用起来很好(您马上就知道您获得的内容类型).看,我没有抓住你问题的重点(现在编辑更清楚了)。看起来你在谈论一些javascript帮助程序。同样,这是通过普通帮助程序类实现的,它定义了一个DSL来为monorail输出javascript。请看:这是我提到的monorail的一部分。我正在寻找一些可以在ASP中处理JS视图的东西,比如monorail中的.njs视图。这更像是r我不想做什么,是的……但是,我更喜欢把视图决策排除在控制器之外,所以我做了一个自定义视图引擎包装器。
public class TypeViewEngine<T> : IViewEngine where T : IViewEngine
{
    private readonly T baseEngine;
    public T BaseEngine
    {
        get { return baseEngine; }
    }

    public TypeViewEngine(T baseEngine)
    {
        this.baseEngine = baseEngine;
    }

    public void RegisterRoutes(RouteCollection routes)
    {
        routes.MapRoute(
            "TypeViewEngine",
            "{controller}/{action}.{type}",
            new {controller = "Home", action = "Index", type = "html"}
            );
    }

    public ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName)
    {
        var vars = controllerContext.RouteData.Values;
        if(vars["type"] != null && vars["type"].ToString() != "html")
        {
            viewName = string.Format("{0}/{1}", vars["type"], viewName);
        }
        return baseEngine.FindView(controllerContext, viewName, masterName);
    }

    public ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName)
    {
        return baseEngine.FindPartialView(controllerContext, partialViewName);
    }

    public void ReleaseView(ControllerContext controllerContext, IView view)
    {
        baseEngine.ReleaseView(controllerContext, view);
    }
}
protected void Application_Start()
{
    var ve = new TypeViewEngine<WebFormViewEngine>(new WebFormViewEngine());
    ve.RegisterRoutes(RouteTable.Routes);
    RegisterRoutes(RouteTable.Routes);

    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(ve);
}