我有一个MVC应用程序,其中包含很多使用Ajax(jQuery)调用的Controller Actions,并返回更新部分屏幕的部分视图内容。但我宁愿做的是返回JSON之类的东西。
return Json(new {
Result = true,
Message = "Item has been saved",
Content = View("Partial")
});
HTML只是Json的一个属性。这意味着我需要检索由View方法呈现的HTML。有没有简单的方法可以做到这一点,我看到的一些例子很复杂。
编辑:这个问题最初是针对ASP.NET MVC 1的,但如果版本2更容易,我想听听答案。
答案 0 :(得分:11)
这是答案!它与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();
}
答案 1 :(得分:2)
答案 2 :(得分:1)
我花了很多时间尝试做同样的事情。我有一个需要延长的快速解决方案。
注意:我已经看到一个问题..任何cookie和其他变量都会丢失:(
我做了什么:
创建新的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));
}
}
数据类
public interface IJsonHtml
{
String HtmlContent { get; set; }
}
public class DefaultJsonHtml : IJsonHtml
{
public String HtmlContent { get; set; }
}
控制器扩展程序
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
};
}
答案 3 :(得分:1)
我正在使用本文中的HTML帮助程序:Render partial view to string in ASP.NET MVC。它完美无缺!
答案 4 :(得分: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;
}
答案 5 :(得分:0)
为什么不只是拥有静态html“partials”并从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);
});
答案 6 :(得分:0)
克雷格,
看看这个。 Jeffery Palermo为ASP.NET MVC编写了一个SubController,可以实现你想要的:
MvcContrib - 现在支持ASP.NET MVC的SubController: http://jeffreypalermo.com/blog/mvccontrib-now-with-subcontroller-support/
答案 7 :(得分:0)