17

我有一个 MVC 应用程序,其中包含很多使用 Ajax (jQuery) 调用的控制器操作,并返回更新屏幕的一部分的部分视图内容。但我宁愿返回 JSON 这样的东西。

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

HTML 只是 Json 的一个属性。这意味着我需要检索 View 方法呈现的 HTML。有什么简单的方法可以做到这一点,我见过的一些例子非常复杂。

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

4

9 回答 9

11

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

从你的控制器调用它是这样的:

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();
}
于 2009-05-26T15:19:39.850 回答
4

NerdDinner有一些很好的例子。这是 NerdDinner 中的 SearchController,它有一个名为 SearchByLocation 的方法,该方法返回 JsonDinners 列表( NerdDinner 的源代码是 Creative Commons):

namespace NerdDinner.Controllers {

    public class JsonDinner {
        public int      DinnerID    { get; set; }
        public string   Title       { get; set; }
        public double   Latitude    { get; set; }
        public double   Longitude   { get; set; }
        public string   Description { get; set; }
        public int      RSVPCount   { get; set; }
    }

    public class SearchController : Controller {

        IDinnerRepository dinnerRepository;

        //
        // Dependency Injection enabled constructors

        public SearchController()
            : this(new DinnerRepository()) {
        }

        public SearchController(IDinnerRepository repository) {
            dinnerRepository = repository;
        }

        //
        // AJAX: /Search/FindByLocation?longitude=45&latitude=-90

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult SearchByLocation(float latitude, float longitude) {

            var dinners = dinnerRepository.FindByLocation(latitude, longitude);

            var jsonDinners = from dinner in dinners
                              select new JsonDinner {
                                  DinnerID = dinner.DinnerID,
                                  Latitude = dinner.Latitude,
                                  Longitude = dinner.Longitude,
                                  Title = dinner.Title,
                                  Description = dinner.Description,
                                  RSVPCount = dinner.RSVPs.Count
                              };

            return Json(jsonDinners.ToList());
        }
    }
}
于 2009-05-26T01:06:21.543 回答
2

这是解决问题的好方法:http: //craftycode.wordpress.com/2010/05/15/asp-net-mvc-render-partial-view-to-string/

于 2010-05-29T10:06:46.130 回答
1

我正在使用本文中的 HTML Helper:Render partial view to string in ASP.NET MVC。它完美地工作!

于 2010-05-05T21:10:09.677 回答
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
        };
    }
    
于 2009-06-22T14:54:56.123 回答
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;
}
于 2012-05-17T23:13:23.093 回答
0

为什么不只使用静态 html“部分”并从 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);
});
于 2009-05-26T01:08:52.770 回答
0

我不知道从哪个版本号开始你可以做到这一点,但现在你可以用一种非常简单的方式返回 JSON:

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

不需要精心制作的助手等。

data 当然是您模型中的数据 JsonRequestBehavior 指定是否允许来自客户端的 HTTP GET 请求。(来源),是可选的,DenyGet是默认行为,所以如果主要使用JsonRequestBehavior.AllowGet就是为什么它在那里

于 2013-04-09T06:56:35.200 回答
0

克雷格,

看看这个。Jeffery Palermo 为 ASP.NET MVC 编写了一个子控制器,它应该可以完成你想要的:

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

于 2009-05-26T02:28:30.050 回答