ASP MVC视图内容作为JSON。

53 浏览
0 Comments

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日
0
0 Comments

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());
        }
    }
}

0
0 Comments

这里是答案!它是从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();
}

0