代码之家  ›  专栏  ›  技术社区  ›  mare

在发出Ajax查看请求时将视图呈现为字符串

  •  0
  • mare  · 技术社区  · 15 年前

    我的视图呈现为路由请求,如/controller/action(例如,/page/create),非常经典。

    我正在创建一个表单,在该表单中,视图将通过jquery get()通过Ajax请求加载,因此本质上我需要我的视图,或者更精确地说,我的控制器操作,以便在向呈现视图的路由发出Ajax请求时返回纯HTML字符串。我希望使用与普通请求相同的视图,因此我无法创建任何新视图。

    它类似于调用renderpartial(“myviewUserControl”),但来自JS代码内部。

    3 回复  |  直到 15 年前
        1
  •  0
  •   SLaks    15 年前

    您需要将HTML字符串移动到部分视图,然后在常规视图中包含部分视图(如果适用),并在操作中呈现部分视图。

    你可能会想用 Request.IsAjaxRequest() 操作中的扩展方法。

    要获得JavaScript中的HTML,您可以向操作的URL发出一个普通的Ajax请求。

        2
  •  0
  •   womp    15 年前

    这里不需要做什么特别的事情-只需要像普通一样使用.get()请求操作方法,并将响应类型设置为“html”。

    $.get('<% Url.Action("MyActionMethod") %>', { },
       function(data){
         alert("Data Loaded: " + data);
       },
       "html")
    
        3
  •  0
  •   mare    15 年前

    我的回答基于Slaks的回应-我正在存档以备日后参考或帮助其他人。

    这是我的结构:

    1)create.aspx(viewpage)使用renderpartial(“tab createditform”)呈现create/edit表单,即 2)tab-createditform.ascx(部分) 3)创建检测正在发出何种请求的操作。如果我们发出Ajax请求,那么我们可能不希望呈现默认的create.aspx,而是希望呈现选项卡createditform,因为它只包含 形式 标记和字段,不包含页面指令、标题、标题和create.aspx中的所有其他元素。

    所以这个动作看起来是这样的:

        //
        // GET: /Tab/Create/{tabGroupSlug}
        [CanReturnModalView]
        [Authorize(Roles = "Administrators")]
        public ActionResult Create(string tabGroupSlug)
        {
            Tab tab = new Tab();
            if (Request.IsAjaxRequest())
                return View("Tab-CreateEditForm", tab); // returns partial
    
            return View(tab); // returns Create.aspx 
        }
    

    这是我的编辑操作,它也使用相同的技术,因为编辑视图(edit.aspx页)也使用相同的编辑部分控件。

        //
        // GET: /Tab/Edit/{slug}
        [CanReturnModalView]
        [Authorize(Roles = "Administrators")]
        public ActionResult Edit(string slug)
        {
            Tab editing = (Tab) _repository.GetInstance(slug);
            if (Request.IsAjaxRequest())
                return View("Tab-CreateEditForm", editing); // returns partial
    
            return View(editing); // returns Edit.aspx
        }