5

私はMVCを始めたばかりなので、多くの混乱があります。asp.net webformプロジェクトでjqueryによってサーバー側関数を呼び出すときは常に、そのメソッドは静的である必要があり、webmethod属性で装飾されている必要があります。だから私はそれがMVCの場合にも同じルールが適用されることを知りたいです。

そのためのコードを入手しましたが、テストしませんでした。

クライアント側の方法

function getTradeContribs(id,pfid, nodedates) {

    var data = {};
    data.portfolioId = pfid;
    data.nodedates = nodedates;

    $.ajax({
            type: "POST",
            url: "/Portfolios/getTradeContribs/"+id,
            dataType: "json",
            data: JSON.stringify(data),
            contentType: "application/json; charset=utf-8",
            success: parseTradeContribs,
            error: function (error) {
                    alert("failed in opening XML file !!!");
            }
    });
   }

サーバー側の方法

public string getTradeContribs(int id,string portfolioId, string nodedates)
{
    string jsonTest = @" {""nodedates"": ""date"":""01/01/2012""}";
    return jsonTest;
}

上記のコードから、私はいくつかの質問があります1)mvcに存在するコントローラーメソッドのタイプ2)url: "/ Portfolios / getTradeContribs"、それはどのようなURLですか。ポートフォリオはコントローラー名であり、getTradeContribsはアクション名ですか?いいえの場合、getTradeContribsはどのようなメソッドです。

3)getTradeContribsがActionResultを返さない理由4)ActionResultの重要性は何ですか?5)idがクエリ文字列として渡され、残りのデータがjsonとして渡される理由。それはどのように機能しますか?

私はMVCを初めて使用するため、この点について話し合ってください

4

2 に答える 2

7

asp.net webformプロジェクトでjqueryによってサーバー側関数を呼び出すときは常に、そのメソッドは静的である必要があり、webmethod属性で装飾されている必要があります。だから私はそれがMVCの場合にも同じルールが適用されることを知りたいです。

いいえ、まったくありません。ASP.NETMVCは完全に異なるパターンです。ASP.NET MVCでは、アクションの結果(ActionResultから派生したクラス)を返すコントローラーアクションを操作します。したがって、JSONを返したい場合は、を返し、JsonResultそれにモデルを渡すコントローラーアクションを定義するだけです。

public ActionResult GetTradeContribs(int id, string portfolioId, string nodedates)
{
    var model = new 
    {
        nodedates = "foo",
        date = DateTime.Now
    };
    return Json(model, JsonRequestBehavior.AllowGet);
}

または、ビューモデルをさらに適切に定義します。

public class TradeContribsRequestViewModel
{
    public int Id { get; set; }
    public string PortfolioId { get; set; }
    public string NodeDates { get; set; }
}

public class TradeContribsViewModel
{
    public string NodeDates { get; set; }
    public DateTime Date { get; set; }
}

その後:

public ActionResult GetTradeContribs(TradeContribsRequestViewModel request)
{
    var model = new TradeContribsViewModel
    {
        NodeDates = "foo",
        Date = DateTime.Now
    };
    return Json(model, JsonRequestBehavior.AllowGet);
}

ASP.NET MVCは、モデルをJSON文字列に自動的にシリアル化し、ビューに渡します。次に、ajaxを使用して呼び出すことができます。

$.ajax({
    url: '@Url.Action("GetTradeContribs", "Portfolios")',
    type: 'POST',
    data: { 
        id: 123, 
        portfolioId: 'some id', 
        nodedates: 'some node dates' 
    },
    success: function(result) {
        // You could directly use the properties of the result object here
        // like for example: alert(result.nodedates);
    }
});

元のメソッドで行ったように、JSONをハードコーディングしないでくださいgetTradeContribs。これは、フレームワークによってすでに処理されているインフラストラクチャの配管です。気にする必要があるのは、以下を定義することだけです。

  • ActionResultを返すコントローラーアクション
  • コントローラアクションがビューに渡すモデルタイプ
  • ビュー
于 2012-08-06T17:42:28.677 に答える
2

ここにあなたの質問に対するいくつかの答えがあります:

  1. mvcにはいくつのタイプのコントローラーメソッドが存在しますか?これが何を意味するのかわかりません。ルーティングされたURLを介してアクセスできるコントローラーのメソッドは、コントローラーアクションメソッドと呼ばれます。これらのメソッドは、ASP.netMVCアプリケーションのGlobal.asaxファイルのRouteConfigクラスを使用してマップされます。
  2. url: "/ Portfolios / getTradeContribs"、それがどのようなURLであるか-これらは安らかなURLです。MVCフレームワークは、これらのURLをコントローラー内の特定のメソッド(コントローラーアクション)にマップします。MVCの基本については、asp.netmvcサイトを参照してください。
  3. getTradeContribsがActionResultを返さない理由-コントローラーアクションからActionResultを返す必要はありません。MVCフレームワークによって提供されるいくつかのアクション結果があります-例えば。ViewResult(ビューを表示するため)、JsonResult(JSONオブジェクトを返す)など。この場合、文字列またはJsonResultを返すことができます。文字列を再取得することにより、クライアント側のスクリプトはそれをJSONオブジェクトに解析する必要があります。JsonResultを返す場合、クライアントスクリプトには入力されたJSONオブジェクトが含まれています。
  4. ActionResultの重要性-ActionResultは抽象基本クラスであり、コントローラーアクションの結果をさまざまな形式(HTML、JSON、XMLなど)に変換します。これは、コントローラーアクションの結果をレンダリングする、または場合によっては結果をクライアントに返すための簡単な方法です。
  5. idがクエリ文字列として渡され、残りのデータがjsonとして渡される理由。仕組み-ASP.NetMVCフレームワークには、モデルバインダーと呼ばれるコンポーネントがあり、アクションメソッドを呼び出すと、クエリ文字列とフォームの投稿値を介して渡された値をバインドし、メソッドのパラメーターにバインドしようとします。値をパラメーターにバインドするために使用されるロジックを変更する場合は、独自のModelbinderをプラグインできます。

これらがあなたの質問に答えることを願っています。ただし、テクノロジーを使い始める前に、そのテクノロジー/フレームワークの基本を学ぶ必要があります。このフォーラムを基本を学ぶ代わりとして扱わないでください。このため、私はあなたの質問を軽視しています。

于 2012-08-06T17:43:18.163 に答える