2008-12-07 90 views
4

我想在ASP.Net MVC的服务器端生成一些JavaScript。有没有一个视图引擎支持这个?理想情况下,我想能够从像一个网址获取JavaScript:是否有支持JavaScript视图的ASP.Net MVC视图引擎?

http://myapp/controller/action.js 

我已经看过了单轨项目,他们似乎有这个功能,但它在文件非常缺乏,我可以”找到ASP.Net MVC的任何端口。

编辑:的想法是能够通过使用URL等,以呈现页面既作为标准HTML:通过使用在第一URL

http://myapp/controller/action 

和JS(具体一个ExtJS成分)这个问题。控制器中只有一个动作,但有两个视图:一个用于HTML,另一个用于JS。

编辑2:我基本上想在CakePHP中实现与router extension parsing/request handling相同的结果。

回答

3

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

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

类为任何类型的视图引擎的装饰,这样你就可以NVelocity/WebForms的使用/不管:

​​

然后,在你的Global.asax.cs文件:

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); 
} 

感谢大家的与此帮助!

1

我必须做一些非常相似的事情,并且我使用了MVCContrib的nvelocity视图引擎 - 从技术上讲,您可以使用默认的aspx视图引擎,但是我发现nvelocity语法更容易理解脚本(don如果你以前没有用过它,别担心 - 我花了大约10分钟就搞清楚了!)。

然后你只需要添加一个路由到路由表来处理指向你的.js url的动作!

编辑

无法验证这是我没有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结束应该经过第一条路线 - 无延伸的要求落到第二条路线。

那么你的行动可以有一个请求类型PARAM:

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

至于目录结构 - 你对你自己与!不是因为我不想帮助,而是更多的是因为你有灵活性去做你想做的事情!

+0

你能或许能给的路线,我可以利用这一点,以及可能的目录结构的例子吗? – Jacob 2008-12-07 19:34:16

+0

这是一个好主意。我基本上将其抽象到查看引擎级别,以使其对控制器透明。 – Jacob 2008-12-08 05:41:43

1

你不一定需要视图引擎,只是返回纯文本结果。

这里是一个控制器(单轨)我已经用于呈现在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放入脚本标记中。

+0

关于扩展程序:我知道,但使用起来相当不错(您立即知道所获内容的类型)。见http://tryingthisagain.com/2007/12/14/aspnet-mvc-routing-limitations/ – Jacob 2008-12-07 19:59:44

0

如果您只是想基于ViewData生成JavaScript,您可以创建自己的自定义结果。 Here就是一个例子。

2

根据你的编辑,我会尝试一个新的答案,因为你需要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); 
    } 

} 
相关问题