ASP MVC视图内容作为JSON。
ASP MVC视图内容作为JSON。
我有一个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使其更容易,我想听到答案。
admin 更改状态以发布 2023年5月24日
NerdDinner提供了一些很好的示例。这里是NerdDinner中的SearchController,其中有一个名为SearchByLocation的方法,该方法返回JsonDinners列表(NerdDinner的源代码是知识共享):
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()); } } }
这里是答案!它是从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(); }