0

我有一个 asp.net mvc 3 应用程序。

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 回答