jQuery AJAX命中控制器操作但返回空字符串而不是部分视图

时间:2015-12-22 11:08:01

标签: c# jquery ajax asp.net-mvc

我已多次使用此设置,但无法理解为什么它在这里不起作用。本质上,对控制器的调用似乎有效,但返回一个空字符串,而不是部分HTML。

我可以像这样呈现部分因此猜测它不是视图本身:

@{
    Html.RenderPartial("_MyPartial")
}

这是干净的AJAX代码,从文档准备好的父剃刀视图调用并调用控制器:

var container = $("#container");

var controllerUrl = "some/url";

var data = {};

$.ajax({
    type: 'POST',
    url: controllerUrl,
    data: data,
    dataType: 'html',
    cache: false,
    success: function(html) {
        // Return HTML to page
        // html is empty string at this point???
        container.html(html);
    },
    error: function(jqXhr, textStatus, errorThrown) {
        // Error occured so return message to page
        container.html('<p>An error has occurred</p><p>' + jqXhr + '<p/><p>' + textStatus + '<p/><p>' + errorThrown + '<p/>');
    }
});

这是控制器:

   [HttpPost]
   public ActionResult ReportModels()
   {
       var viewModel = new ViewModel(); // props get set in original code

       return PartialView("_MyPartial", viewModel);
   }

1 个答案:

答案 0 :(得分:0)

从你的ajax中删除字段dataType:'html'。并将此作为行动方法

    [HttpPost]
    public ActionResult ReportModels()
    {
        var partialView = RenderRazorViewToString("_MyPartial", new ViewModel(););
        return Json(partialView);
    }

    public string RenderRazorViewToString(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();
        }
    }