0

asp.net mvc 3 アプリケーションが 1 つあります。

public ActionResult Students()
{ 
  return View();
}

ブラウザからこれらのアクションをリクエストすると、すべて正常に動作します。適切なビューを返しますが、そのようなアクションが別のサイト (ドメイン全体) から jQuery Ajax 呼び出しを介して呼び出されると、トランスポート エラーが発生します。

その結果、そのようなビューを JsonpResult タイプで返す必要がありますが、問題はブラウザが JsonpResult タイプのそのようなビューをどのようにロードするかということです。ビューのhtml部分を返すのではなく、Jsonpタイプのビュー結果を保存するようブラウザに要求します。

これを解決する方法はありますか?

ありがとう。

4

1 に答える 1

0

この回答RenderPartialViewToStringに示されているメソッドを使用して、ビューを文字列にレンダリングし、作成したカスタム JsonpResult を返すことができます。

public class StudentsController : Controller
{
    public ActionResult Index()
    {
        MyViewModel model = ...
        return new JsonpResult(new 
        {
            html = RenderViewToString("Index", model)
        });
    }

    public string RenderViewToString(string viewName, object model)
    {
        ViewData.Model = model;
        using (var sw = new StringWriter())
        {
            var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
            var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);
            viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
            return sw.GetStringBuilder().ToString();
        }
    }

    protected string RenderPartialViewToString(string viewName, object model)
    {
        if (string.IsNullOrEmpty(viewName))
        {
            viewName = ControllerContext.RouteData.GetRequiredString("action");
        }

        ViewData.Model = model;
        using (var sw = new StringWriter())
        {
            var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
            var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);
            return sw.GetStringBuilder().ToString();
        }
    }
}

ここJsonpResultで使用されるクラスは、この投稿にあります。

これで、別のドメインから AJAX を使用してこのコントローラー アクションを呼び出すことができます。

var url = 'http://example.com/students/index';
$.getJSON(url + '?callback=?', function (data) {
    alert(data.html);
});
于 2012-09-26T09:25:29.977 に答える