是否有支持JavaScript视图的ASP.NETMVC视图引擎?
我想在ASP.NETMVC的服务器端生成一些JavaScript。是否有支持此功能的视图引擎?理想情况下,我希望能够从url获取JavaScript,如:是否有支持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(特别
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);
}