返回结合布尔值的JSON视图

时间:2010-04-13 08:57:30

标签: asp.net asp.net-mvc json asp.net-mvc-2

我想要完成的是一个partiel视图包含一个表单。此表单使用JQuery $ .post发布。在成功发布后,javascript会获取结果并使用JQuery的html()方法来填充带有结果的容器。

但是现在我不想返回部分视图,而是返回包含该局部视图和其他一些对象的JSON对象(在这种情况下,成功 - > 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)
        });
    }

但是我没有在这个JSON对象中获取HTML,也无法使用html()来显示结果。我尝试使用this方法将部分渲染为Html并发送。但是,这在RenderControl(tw)方法上失败,但是:方法或操作未实现。

2 个答案:

答案 0 :(得分:1)

是的,有一种更清洁的方式(我认为也更容易)。使用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选项。

答案 1 :(得分:0)

好的,找出为什么这个页面上的代码:
Render a view as a string
没用。

愚蠢:我必须包含System.Web.Mvc.Html才能在HtmlHelper对象上使用renderpartial。

然而,我并不是真的相信这个解决方案。必须有一个更清洁的方式吗?