ASP MVC将内容视为JSON

Cra*_*aig 17 asp.net-mvc json partial

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

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

HTML只是Json的一个属性.这意味着我需要检索由View方法呈现的HTML.有没有简单的方法可以做到这一点,我看到的一些例子非常令人费解.

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

Jon*_*Jon 11

这是答案!从Martin From的方法稍微改变,似乎工作.如果缺少某些内容,请人们在评论部分中提供任何代码更改.谢谢.

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

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

将其添加到课程中

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();
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*vey 4

NerdDinner有一些很好的例子。这是 NerdDinner 中的 SearchController,它有一个名为 SearchByLocation 的方法,该方法返回 JsonDinner 列表( 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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)