在asp.net mvc3中,
我正在使用javascript API动态呈现用户界面。输入部分的一部分将取决于用户想要输入数据的项目数。结果,像这样的东西不会起作用
@(Html.EditorFor(m => m.P[5].C.Description))
因为在运行时无法完成。我将使用什么类型的进程在运行时使用AJAX调用该帮助程序?我是否会有一个控制器操作,它只返回使用$.ajax()
调用的信息?它会在与控制器动作不同的地方吗?
答案 0 :(得分:3)
在运行时,您可以执行ajax获取控制器操作,该操作将视图呈现为字符串,然后可以将其插入/附加到DOM中。
创建一个新的动作结果,按以下方式返回JSON:
return new JsonResult
{
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
Data = new { html = this.RenderPartialViewToString("YourPartialView", model) }
};
注意,上面使用了以下控制器扩展名:
public static string RenderPartialViewToString(this Controller controller, string viewName = null, object model = null)
{
if (string.IsNullOrEmpty(viewName))
{
viewName = controller.ControllerContext.RouteData.GetRequiredString("action");
}
controller.ViewData.Model = model;
using (var sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
有关此扩展方法的进一步阅读:http://craftycodeblog.com/2010/05/15/asp-net-mvc-render-partial-view-to-string/
所有剩下的就是执行get传递参数,表示要渲染的项目数,并将返回的内容附加到视图中。也许是这样的事情:
$.getJSON('url', numberofitems, function (data) {
$('#somecontainer').html(data.html);
});
答案 1 :(得分:1)
如果要提取HTML并将其插入DOM,则不必通过JSON。 只需让您的操作返回PartialView即可。它已经是Html的形式,并准备插入你的DOM
JS
$.getJSON('/someurl/GetMyView',{count:10}, function (data) {
$('#target').html(data);
});
控制器:
[HttpGet]
public ActionResult GetMyView(int count)
{
MyModel model = //Get the model from somewhere
return PartialView(model);
}
查看:
@model MyModel
<div>
@Model.SomeProperty
<div>
答案 2 :(得分:0)
如果我理解正确,您希望在客户端上动态插入字段,以允许用户添加N个字段而不在表单上有大量预渲染字段,并且您尝试使用ajax来执行此操作?
我确信你可以通过在服务器上渲染html并将其推送到客户端来实现它...你考虑通过javascript动态添加到页面吗?与Webforms不同,MVC不关心页面在呈现时是什么元素,它只关心它在HttpPost中接收的数据。