4

ASP.Net MVC のサーバー側で JavaScript を生成したいと考えています。これをサポートするビュー エンジンはありますか? 理想的には、次のような URL から JavaScript を取得できるようにしたいと考えています。

http://myapp/controller/action.js

MonoRail プロジェクトを調べたところ、この機能があるようですが、ドキュメントが非常に不足しており、ASP.Net MVC へのポートが見つかりません。

編集:アイデアは、次のような URL を使用して、標準の HTML としてページをレンダリングできるようにすることです。

http://myapp/controller/action

質問の最初のURLを使用してjs(具体的にはExtJSコンポーネント)として。コントローラーには 1 つのアクションしかありませんが、2 つのビュー (HTML 用と JS 用) があります。

編集 2:基本的に、CakePHP でのルーター拡張機能の解析/リクエスト処理と同じ結果を達成したいと考えていました。

4

6 に答える 6

3

このアイデアを拡張して、Javascript ビューだけでなく、多かれ少なかれあらゆるタイプのドキュメントを許可したいと考えました。これを使用するには、*.js URL のビューをコントローラーのビュー フォルダーのサブフォルダーに配置するだけです。

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

このクラスは、あらゆるタイプの ViewEngine のデコレーターであるため、NVelocity/WebForms/Whatever で使用できます。

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

次に、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);
}

これについてみんなの助けをありがとう!

于 2008-12-08T05:54:59.363 に答える
2

2007年7月のASP.NETFuturesリリースには、新しいマネージドJScriptが含まれています(新しいものが見つかりません)。私はそれを少しうまく打ち負かしました-しかし、注意してください、あなたはおそらくいくつかの余分な仕事をすることを余儀なくされるでしょう、JScriptのための.ASPX解析は使用できないほどバグがあります。

http://www.microsoft.com/downloads/details.aspx?FamilyId=A5189BCB-EF81-4C12-9733-E294D13A58E6&displaylang=en

于 2009-02-03T19:56:30.553 に答える
2

あなたの編集に基づいて、ExtJS の json データが必要であると仮定して、新しい回答を試してみます。作成中のアプリでテストしたところ、正常に動作します。まず、2 つのルートが必要です

{controller}/{action}.{format}

{controller}/{action}

Controller クラスには、必要なオブジェクトをシリアル化するための Json メソッドがあり、それは JsonResult であるため、次のように使用できます。

public ActionResult List(string format) {

    // logic here

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

}
于 2008-12-07T20:44:40.020 に答える
1

そのために必ずしもビューエンジンは必要ありません。プレーンテキストの結果を返すだけです。

これは、JavaScript オブジェクトでいくつかのユーザー カルチャ設定をレンダリングするために使用したコントローラー (MonoRail) です。

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

生のテキストのレンダリングが臭うような、より複雑なものについては、どのビュー エンジンでも機能します。

また、script タグに URL を入れるために .js 拡張子を使用する必要はありません。

于 2008-12-07T19:50:24.733 に答える
1

私は非常に似たようなことをしなければならず、MVCContrib の nvelocity ビュー エンジンを使用しました- 技術的には、デフォルトの aspx ビュー エンジンを使用することもできますが、nvelocity 構文はスクリプトを出力するのにはるかに簡単であることがわかりました (あなたは以前にそれを使用したことがありません - 私はそれを理解するのに約 10 分を費やしました!)。

次に、ルート テーブルにルートを追加して、.js URL をアクションに送信する必要があります。

編集

手元にビジュアルスタジオがないため、これを確認することはできませんが、ルートについては、次のようなものがあるかもしれません:

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 で終わるリクエストは最初のルートを通過する必要があります。拡張子のないリクエストは 2 番目のルートに進みます。

次に、アクションに requestType パラメータを含めることができます。

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

ディレクトリ構造に関しては、あなたはそれであなた自身です!私が役に立ちたくないからではなく、あなたがそれを使ってやりたいことをする柔軟性があるという事実にもっと根ざしています!

于 2008-12-07T19:28:33.543 に答える
0

ViewData に基づいて JavaScript を生成するだけの場合は、独自のカスタム結果を作成できます。ここに例があります。

于 2008-12-07T19:54:29.810 に答える