如何使用HtmlHelper生成的序列化对象和html向ajax调用发送json响应



对于C#和MVC,为了响应用Jquery进行的ajax调用,我试图发送一个对象作为响应,该对象将包含一个List<int>和一些html代码,这些代码是用我编写的HtmlHelperExtension生成的。

以前,我只发送回html,所以我在部分视图中呈现HtmlHelper并返回它。但现在,例如,我想创建一个具有两个属性的对象,列表和一个表示html的字符串,在Json中序列化该对象,并将其发送回以响应ajax调用。

但似乎除了使用破解之外,不可能也不建议在控制器中使用HtmlHelper

我还想忘记htmlHelper的事情,只在一个类中呈现我的html代码,这个类将是我当前HtmlHelper的精确副本。

你认为有没有一种方法可以将控制器中的List<int>和从HtmlHelper返回的html放在一个对象中,并对其进行序列化,将其发送回javascript中的ajax调用?

谢谢!

MVC本机不支持对字符串的视图,它只是返回它。但是,您可以创建一个自定义控制器,并使用一个允许这样做的方法。我在网上的某个地方找到了这个代码——记不起是在哪里——它做得很好。

public class ExtendedController : Controller
{
public string RenderPartialView(string viewName, object model)
{
if (string.IsNullOrEmpty(viewName))
viewName = this.ControllerContext.RouteData.GetRequiredString("action");
this.ViewData.Model = model;
using (var sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(this.ControllerContext, viewName);
var viewContext = new ViewContext(this.ControllerContext, viewResult.View, this.ViewData, this.TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
}

然后将控制器创建为

public class MyController : ExtendedController
{
public ActionResult MyAjaxOp()
{
List<int> MyList = new List<int>(); // Populate the list as required
object MyHelperModel = new object(); // View Model as required
object rtn = new { html = RenderPartialView("MyHelperView", MyHelperModel), list = MyList}
return Json(rtn, JsonRequestBehavior.AllowGet);
}
}

这将允许您将渲染的视图放入字符串中,并将其传递给客户端。

以上是未经测试的示例代码,请根据您的需求进行修改。

最新更新