ASP MVC将内容视为JSON

时间:2009-05-26 00:15:34

标签: asp.net-mvc json partial

我有一个MVC应用程序,其中包含很多使用Ajax(jQuery)调用的Controller Actions,并返回更新部分屏幕的部分视图内容。但我宁愿做的是返回JSON之类的东西。

return Json(new { 
    Result = true, 
    Message = "Item has been saved", 
    Content = View("Partial") 
});

HTML只是Json的一个属性。这意味着我需要检索由View方法呈现的HTML。有没有简单的方法可以做到这一点,我看到的一些例子很复杂。

编辑:这个问题最初是针对ASP.NET MVC 1的,但如果版本2更容易,我想听听答案。

8 个答案:

答案 0 :(得分:11)

这是答案!它与Martin From's方法略有不同,似乎有效。如果缺少某些内容,请人们在评论部分中提供任何代码更改。感谢。

从你的控制器这样称呼:

string HTMLOutput = Utils.RenderPartialToString("~/Views/Setting/IndexMain.ascx", "", items, this.ControllerContext.RequestContext);

将其添加到班级

public static string RenderPartialToString(string controlName, object viewData, object model, System.Web.Routing.RequestContext viewContext)
{
     ViewDataDictionary vd = new ViewDataDictionary(viewData);
     ViewPage vp = new ViewPage { ViewData = vd };

     vp.ViewData = vd;
     vp.ViewData.Model = model;
     vp.ViewContext = new ViewContext();
     vp.Url = new UrlHelper(viewContext);

     Control control = vp.LoadControl(controlName);

     vp.Controls.Add(control);

     StringBuilder sb = new StringBuilder();

     using (StringWriter sw = new StringWriter(sb))
     using (HtmlTextWriter tw = new HtmlTextWriter(sw))
     {
         vp.RenderControl(tw);
     }

     return sb.ToString();
}

答案 1 :(得分:2)

答案 2 :(得分:1)

我花了很多时间尝试做同样的事情。我有一个需要延长的快速解决方案。

注意:我已经看到一个问题..任何cookie和其他变量都会丢失:(

我做了什么:

  1. 创建新的ActionResult

    public class JsonHtmlViewResult : ViewResult
    {
        public IJsonHtml Data { get; set; }
    
        public override void ExecuteResult(ControllerContext context)
        {
            if (Data == null)
            {
                Data = new DefaultJsonHtml();
            }
    
            using (StringWriter sw = new StringWriter())
            {
                HttpRequest request = HttpContext.Current.Request;
                HttpContext.Current = new HttpContext(request, new HttpResponse(sw));
    
                base.ExecuteResult(context);
    
                Data.HtmlContent = sw.ToString();
            }
    
            // Do the serialization stuff.
            HttpResponseBase response = context.HttpContext.Response;
            response.ClearContent();
            response.ContentType = "application/json";
    
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            response.Write(serializer.Serialize(Data));
        }
    }
    
  2. 数据类

    public interface IJsonHtml
    {
        String HtmlContent { get; set; }
    }
    
    public class DefaultJsonHtml : IJsonHtml
    {
        public String HtmlContent { get; set; }
    }
    
  3. 控制器扩展程序

    public static ActionResult JsonHtmlViewResult(this Controller controller, string viewName, string masterName, object model, IJsonHtml data)
    {
        if (model != null)
        {
            controller.ViewData.Model = model;
        }
    
        return new JsonHtmlViewResult
        {
            Data = data,
            ViewName = viewName,
            MasterName = masterName,
            ViewData = controller.ViewData,
            TempData = controller.TempData
        };
    }
    

答案 3 :(得分:1)

我正在使用本文中的HTML帮助程序:Render partial view to string in ASP.NET MVC。它完美无缺!

答案 4 :(得分:1)

我发现使用Razor的最新答案可能会有帮助http://codepaste.net/8xkoj2

public static string RenderViewToString(string viewPath, object model,ControllerContext context)
{            
    var viewEngineResult = ViewEngines.Engines.FindView(context, viewPath, null);
    var view = viewEngineResult.View;


    context.Controller.ViewData.Model = model;

    string result = String.Empty;
    using (var sw = new StringWriter())
    {

        var ctx = new ViewContext(context, view, 
                                  context.Controller.ViewData, 
                                  context.Controller.TempData, 
                                  sw);
        view.Render(ctx, sw);

        result = sw.ToString();
    }

    return result;
}

答案 5 :(得分:0)

为什么不只是拥有静态html“partials”并从json中获取所有动态内容?您应该能够在页面加载时或在需要时非常轻松地使用jquery加载html文件。

JQuery Ajax上的此链接提供了以下示例:

//Alert out the results from requesting test.php (HTML or XML, depending on what was returned).
$.get("test.php", function(data){
  alert("Data Loaded: " + data);
});

答案 6 :(得分:0)

克雷格,

看看这个。 Jeffery Palermo为ASP.NET MVC编写了一个SubController,可以实现你想要的:

MvcContrib - 现在支持ASP.NET MVC的SubController: http://jeffreypalermo.com/blog/mvccontrib-now-with-subcontroller-support/

答案 7 :(得分:0)

我不知道你可以使用哪个版本号,但现在你可以用一种非常简单的方式返回JSON:

public ActionResult JSONaction()
{
    return Json(data, JsonRequestBehavior);
}

不需要精心设计的助手等。

数据当然是您模型中的数据 JsonRequestBehavior指定是否允许来自客户端的HTTP GET请求。 (source),是可选的DenyGet是默认行为,因此,如果主要使用JsonRequestBehavior.AllowGethere,那么这就是为什么