可以在ASP.Net MVC中将视图作为JSON对象返回

时间:2010-04-10 11:17:41

标签: jquery asp.net-mvc

我想知道是否可以将视图作为JSON对象返回。在我的控制器中,我想做类似以下的事情:

        [AcceptVerbs("Post")]
        public JsonResult SomeActionMethod()
        {
            return new JsonResult { Data = new { success = true, view = PartialView("MyPartialView") } };
        }

在html中:

 $.post($(this).attr('action'), $(this).serialize(), function(Data) {
                        alert(Data.success);
                        $("#test").replaceWith(Data.view);

                    });

任何反馈都非常感谢。

3 个答案:

答案 0 :(得分:3)

我真的不推荐这种方法 - 如果你想确保调用成功,请使用协议和jQuery库中内置的HTTPHeader。如果您查看$.ajax的API文档,您可以对不同的HTTP状态代码有不同的反应 - 例如,有成功和错误回调。 使用这种方法,您的代码看起来像

$.ajax({
    url: $(this).attr('action'),
    type: 'POST',
    data: $(this).serialize(),
    dataType: 'HTML',
    success: function(data, textStatus, XMLHttpRequest) { 
                 alert(textStatus);
                 $('#test').html(data); 
             },
    error: function(XmlHttpRequest, textStatus, errorThrown) {
               // Do whatever error handling you want here.
               // If you don't want any, the error parameter
               //(and all others) are optional
           }
    }

动作方法只返回PartialView

public ActionResult ThisOrThat()
{
    return PartialView("ThisOrThat");
}

但是,也可以按照自己的方式完成。您的方法的问题是您返回PartialView本身,而不是输出HTML。如果您将其更改为此代码,则代码将起作用:

public ActionResult HelpSO()
{
    // Get the IView of the PartialView object.
    var view = PartialView("ThisOrThat").View;

    // Initialize a StringWriter for rendering the output.
    var writer = new StringWriter();

    // Do the actual rendering.
    view.Render(ControllerContext.ParentActionViewContext, writer);
    // The output is now rendered to the StringWriter, and we can access it
    // as a normal string object via writer.ToString().

    // Note that I'm using the method Json(), rather than new JsonResult().
    // I'm not sure it matters (they should do the same thing) but it's the 
    // recommended way to return Json.
    return Json(new { success = true, Data = writer.ToString() });
}

答案 1 :(得分:0)

为什么要返回封装在JSON对象中的视图? 它可能会起作用,但它是下一个开发人员说“WTF?!?”的开门。

为什么不让你的动作返回PartialView调用$ .get()并注入它,甚至更好地调用

$("#target").load(url);

修改

好吧,既然你要发布值,你可以使用get或load,但是你的方法仍然没有多大意义...... 我想您将根据返回的json对象中的成功变量应用一些更改。但是你最好在服务器端保留这种逻辑,并根据你的条件返回一个或另一个视图。你可以返回一个JavascriptRersult,例如,一旦检索到它就会执行javascript ...或者返回2个不同的PartialViews。

答案 2 :(得分:0)

看看这个例子 http://geekswithblogs.net/michelotti/archive/2008/06/28/mvc-json---jsonresult-and-jquery.aspx

你应该能够返回this.Json(obj),其中obj只是你要序列化的数据。

此外,如果您使用类型设置为'json'的$ .getJSON或$ .ajax方法,那么结果将自动转换为客户端上的javascript对象,因此您可以使用数据而不是字符串。