我有一个MVC应用程序,有相当多的控制器操作,使用Ajax (jQuery)调用,并返回部分视图内容,更新屏幕的一部分。但我更愿意做的是返回类似这样的JSON。
return Json(new {
Result = true,
Message = "Item has been saved",
Content = View("Partial")
});
其中HTML只是Json的一个属性。这意味着我需要检索View方法呈现的HTML。有没有什么简单的方法可以做到这一点,我见过的一些例子是相当复杂的。
编辑:这个问题最初是针对ASP.NET MVC1的,但如果版本2让它变得更容易,我希望听到答案。
发布于 2009-05-26 15:19:40
这就是答案!与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();
}
发布于 2009-05-26 01:06:22
NerdDinner在这方面有一些很好的例子。下面是NerdDinner中的SearchController,它有一个名为SearchByLocation的方法,该方法返回一个JsonDinners列表( NerdDinner的source code是知识共享):
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());
}
}
}
发布于 2010-05-29 18:06:46
https://stackoverflow.com/questions/908450
复制相似问题