3

私の Index() メソッドが受信した accept/content-type ヘッダーに基づいてコンテンツを返す正しい方法は何ですか?

現在、Index() メソッドと JsonData() メソッドを持つアプリケーションをリファクタリングしようとしています。ブラウザーはこの「インデックス」ページをプルし、Ajax を介して /jsondata URL を要求します。両方を Index() の下に置き、着信要求に応じて応答タイプを変更したいと思います。MVC 4 でこれを行う正しい方法は何ですか?

注: Web API は使用していません。

4

2 に答える 2

3

ここにはいくつかのオプションがあります。

まず、リクエストを動詞で区別し、すべてGETの s が html を受信する一方で、すべてPOSTの s が json を受信するなどの規則を設けます。コントローラーは次のようになります。

[HttpGet]
[ActionName("Index")]
public ActionResult IndexGet()
{
    return View();
}


[HttpPost]
[ActionName("Index")]
public ActionResult IndexPost()
{
    return Json();
}

そしてもちろん、正しい方法でリクエストを行うのはクライアント側の問題です。更新- ここでは動詞だけでは不十分です - 1 つのアクション名を保持するには、ActionName属性も使用する必要があります。それを指摘してくれたJoe Enosに感謝します。

2 番目 - パラメータを導入します。デフォルトではhtmlを送信しているとしますが、ajax呼び出しがパラメーターを追加する場合isJson-json応答を与えます:

public ActionResult Index(bool? isJson)
{
    if (isJson.HasValue && isJson.Value)
    {
        return Json();
    }

    return View();
}

3 番目 - リクエストの背後にあるメカニズムによってリクエストを区別します。あなたの場合、すべてのajax呼び出し、およびそれらのみがjsonによって提供されるべきであるようです。次に、メソッドを使用できますRequest.IsAjaxRequest()

public ActionResult Index()
{
    if (Request.IsAjaxRequest())
    {
        return Json();
    }

    return View();
}

もちろん、これらのメソッドを組み合わせることも可能です。たとえば、JSON レスポンスを ajax による POST リクエストに対してのみ送信します。

于 2013-06-19T15:00:07.590 に答える
1

これを AcceptTypes リクエストで解決してみてはいかがですか?

 public ActionResult Index()
        {
            if (Request.AcceptTypes.Contains("application/json"))
            {
                //
            }
            else 
            {

            }
            return View();
        }
于 2013-06-19T15:02:24.720 に答える