在 asp.net mvc3 中,
我正在使用 javascript API 来动态呈现用户界面。输入部分的一部分将取决于用户想要输入数据的项目数量。结果,这样的事情不会起作用
@(Html.EditorFor(m => m.P[5].C.Description))
因为这不能在运行时完成。在运行时使用 AJAX 时,我将使用什么类型的进程来调用该助手?我会有一个控制器操作,它只返回使用调用的信息$.ajax()
吗?它会在与控制器动作不同的地方吗?
在 asp.net mvc3 中,
我正在使用 javascript API 来动态呈现用户界面。输入部分的一部分将取决于用户想要输入数据的项目数量。结果,这样的事情不会起作用
@(Html.EditorFor(m => m.P[5].C.Description))
因为这不能在运行时完成。在运行时使用 AJAX 时,我将使用什么类型的进程来调用该助手?我会有一个控制器操作,它只返回使用调用的信息$.ajax()
吗?它会在与控制器动作不同的地方吗?
在运行时,您可以对控制器操作执行 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);
});
如果您要提取 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>
如果我理解正确,您希望在客户端上动态插入字段以允许用户添加 N 个字段而无需在表单上预渲染大量字段,并且您正在尝试使用 ajax 来执行此操作?
我相信您可以通过在服务器上呈现 html 并将其推送到客户端来做到这一点...您是否考虑过通过 javascript 将其动态添加到页面?与 Webforms 不同,MVC 不关心页面渲染时页面上有哪些元素,它只关心它在 HttpPost 中接收到的数据。