Невозможно вернуть PartialView для вызова jQuery.ajax - PullRequest
3 голосов
/ 07 марта 2012

Справочная информация:

Я работаю над приложением ASP.NET MVC, которое имеет 3 части (на основе движка Razor) на главной странице. Первый фрагмент содержит список критериев поиска, которые заполняет пользователь. Второй фрагмент должен отображать список ParameterParts на основе переданных данных. Предполагается, что третья часть отображает список спецификаций на основе переданных данных. Мне нужно вызывать методы в контроллере для заполнения моего 2-го и 3-го частичных представлений.

Выпуск:

  • Возврат PartialView приводит к тому, что вызов ajax соответствует условию ошибки.
  • Возвращение void соответствует условию успеха, но тогда мне нечего заполнить параметром Result.
  • Возвращение json соответствует условию успеха, но тогда мой частичный просмотр ничего не отображает.
  • Кажется, что все будет работать, если я смогу преобразовать свое частичное представление в строку и вернуть его в виде json (http://www.tugberkugurlu.com/archive/working-with-jquery-ajax-api-on-asp-net-mvc-3-0-power-of-json-jquery-and-asp-net-mvc-partial-views), но для этого нужно скачать библиотеку с использованием Nuget, которая почему-то не работает из-за нашего корпоративный брандмауэр.

Код родительского представления (index.cshtml) для всех трех частичных элементов

<div class="prepend-top span-24 last" id="searchPage">
    <div class="span-24 last">
        @Html.Partial("_Search")
    </div>
    <div class="span-24 last" id="parameterResults">
        @Html.Partial("_ParameterParts")
    </div>
    <div class="span-24 last" id="searchSpecResults">
        @Html.Partial("_Specifications")
    </div>
</div>

Код для первого частичного (_Search.cshtml):

 // Post the object to the server using jQuery
 $.ajax({
     url: '@Url.Action("ParameterParts")',
     type: 'POST',
     dataType: 'html',
     data: dataToPass,
     error: function (data) { alert('Something Went Wrong'); },
     contentType: 'application/json; charset=utf-8',
     success: function (data) {
         alert('Success P');
         $("parameterResults").html(data);
     }
 });

Этот код правильно вызывает метод ParameterParts с параметром dataToPass.

Вот код, который я использую для метода контроллера:

[HttpPost]
public ActionResult ParameterParts(CriteriaViewModel vm)
{
    List<ParameterPart> parameterParts = new List<ParameterPart>();

    //Some logic to populate parameterParts using the passed in object

    return PartialView("_ParameterParts", parameterParts);
}

Код для 2-й части:

@model IEnumerable<SmartPlex.Web.SmartPlex.ODataService.ParameterPart>

<table>
    <tr>
        <th>
            Part Number
        </th>
        <th>
            Description
        </th>
    </tr>
    @if (Model != null)
    {
        foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.PartNumber)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Description)
                </td>

            </tr> 
         }                       
    }
</table>

Я не включаю 3-й частичный, поскольку он такой же, как 2-й. Как я могу обновить свои партиалы, используя вышеуказанный метод?

Ответы [ 2 ]

5 голосов
/ 07 марта 2012
 dataType: 'dataToPass',
 data: json,

dataType - это тип данных, который вы ожидаете от сервера.Что не должно быть json, если вы возвращаете html.

данные - это данные для отправки на сервер.

Обновление:

Вы пропустили #, вашселектор неверен.Если ваш html такой:

<div class="span-24 last" id="parameterResults">
  @Html.Partial("_ParameterParts")
</div>

, ваш код должен быть таким:

 $("#parameterResults").html(data);
1 голос
/ 07 марта 2012

вам не нужна отдельная библиотека для визуализации частичных представлений в виде строки. создайте метод расширения следующим образом:

 public static class RazorViewToString  
{
    public static string RenderRazorViewToString(this Controller controller, string viewName, object model)
    {
        if (controller==null)
        {
            throw new ArgumentNullException("controller", "Extension method called on a null controller");
        }

        if (controller.ControllerContext==null)
        {
            return string.Empty;
        }

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

}

тогда внутри вашего контроллера вы можете использовать это как

return new JsonResult {Data = this.RenderRazorViewToString("partialViewName", model)};

затем на клиентском jquery ajax success callback просто добавьте возвращенные данные в ваш dom

http://craftycodeblog.com/2010/05/15/asp-net-mvc-render-partial-view-to-string/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...