【问题标题】:Is it possible to use AJAX to access an html helper?是否可以使用 AJAX 访问 html 助手?
【发布时间】:2012-05-31 12:41:20
【问题描述】:

在asp.net mvc3中,

我正在使用 javascript API 来动态呈现用户界面。输入部分的一部分将取决于用户想要输入数据的项目数量。结果,这样的事情就行不通了

@(Html.EditorFor(m => m.P[5].C.Description))

因为在运行时无法做到这一点。在使用 AJAX 运行时,我将使用什么类型的进程来调用该助手?我会有一个只返回使用$.ajax() 调用的信息的控制器操作吗?它会与控制器操作位于不同的位置吗?

【问题讨论】:

    标签: asp.net-mvc-3 razor helper


    【解决方案1】:

    在运行时,您可以对控制器操作执行 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);
        });
    

    【讨论】:

      【解决方案2】:

      如果您要提取 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>
      

      【讨论】:

        【解决方案3】:

        如果我对您的理解正确,您想在客户端上动态插入字段以允许用户添加 N 个字段而无需在表单上预渲染大量字段,并且您正在尝试使用 ajax 来执行此操作?

        我相信您可以通过在服务器上呈现 html 并将其推送到客户端来做到这一点...您是否考虑过通过 javascript 将 html 动态添加到页面?与 Webforms 不同,MVC 不关心页面渲染时页面上有哪些元素,它只关心它在 HttpPost 中接收到的数据。

        【讨论】:

        • 对不起,如果我解释得不够充分。我正在使用 javascript 来动态插入字段(即 UI API)。但是,对于某些字段,尤其是下拉菜单,我希望能够在那里使用助手。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多