Возврат представления JSON в сочетании с логическим значением - PullRequest
0 голосов
/ 13 апреля 2010

Чего я хотел бы добиться, так это того, что представление partiel содержит форму. Эта форма размещена с использованием JQuery $ .post. После успешной публикации javascript получает результат и использует метод JQuery html (), чтобы заполнить контейнер результатом.

Однако теперь я не хочу возвращать частичное представление, но объект JSON, содержащий это частичное представление и некоторый другой объект (в этом случае Success -> bool).

Я попробовал это с помощью следующего кода:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(int id, Item item)
    {
        if (ModelState.IsValid)
        {
            try
            {
                // ...
                return Json(new
                {
                    Success = true,
                    PartialView = PartialView("Edit", item)
                });
            }
            catch(Exception ex)
            {
                // ...
            }
        }

        return Json(new
        {
            Success = false,
            PartialView = PartialView("Edit", item)
        });
    }

Однако я не получаю HTML в этом объекте JSON и не могу использовать html (), чтобы показать результат. Я попытался использовать метод this , чтобы сделать партиал в виде HTML и отправить его. Однако это не удается на методе RenderControl (tw) с: Метод или операция не реализованы.

Ответы [ 2 ]

1 голос
/ 07 января 2011

Да, есть более чистый путь (я тоже думаю, что проще). С помощником MVC AJAX.

Например, на ваш взгляд:

<% using (Ajax.BeginForm("Edit", new { id = Model.Id},
   new AjaxOptions
   {
       UpdateTargetId = "divId", //id of the container
       OnFailure= "function(){ alert('Error');}" //can be a callback too
   }))
   { %>

Тогда в вашем контроллере:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, Item item)
{
    if (ModelState.IsValid)
    {
        try
        {
            // ...
            return PartialView("Edit", item); //your container will be updated with this content
        }
        catch(Exception ex)
        {
            // ...
            return ReturnStatusCodeError("Item not found", HttpStatusCode.NotFound); //the ajax script will catch this error and fire the OnFailure event
        }
    }

    return ReturnStatusCodeError("Error", HttpStatusCode.Conflict); //can be changed to an error of your preference
}


protected ActionResult ReturnStatusCodeError(string error, HttpStatusCode code)
{
    Response.StatusCode = (int)code;
    Response.Write(error);
    Response.End();

    //redundant. Just for compiler compliance
    return View();
}

Таким образом, ваш контейнер может автоматически обновляться при отправке и успешном выполнении. Если есть ошибка, вы можете сделать что-то более сложное, настроив параметр «OnFailure» ajax.

0 голосов
/ 13 апреля 2010

Хорошо, выяснил, почему код на этой странице:
Визуализация представления в виде строки
не сработало.

Глупо: мне пришлось включить System.Web.Mvc.Html, чтобы использовать визуализацию для объекта HtmlHelper.

Однако я не очень уверен в этом решении. Должен быть более чистый путь?

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