【问题标题】:ajax request to return partial viewajax 请求返回部分视图
【发布时间】:2012-10-08 20:11:41
【问题描述】:

我正在尝试在 ajax 更新的部分视图上返回请求。显然请求不是从 ajax 函数返回的。 这里的ajax代码:

<script type="text/javascript">
function doAjaxPost(myid) {
    // get the form values
    var ApplSort = $('#DropDownListSort').val();
    var radio_check_val=0;

    for (i = 0; i < document.getElementsByName('radio').length; i++) {
        if (document.getElementsByName('radio')[i].checked) {
            radio_check_val = document.getElementsByName('radio')[i].value;
        }
    }

    // alert("myid=" + myid +";"+ "ApplSort=" + ApplSort + ";" + "radio_check_val=" + radio_check_val);

    $.ajax(
 {
     type: 'POST',
     contentType: 'application/json; charset=utf-8',
     data: { ApplSort: ApplSort, radio_check_val: radio_check_val, myid: myid },
     UpdateTargetId: "tabledata",
     dataType: 'html',
     url: 'Partner/PartnerApplications',
     success: function (data) { 
      var result = data;
      $('tabledata').html(result);
},

     error: function (error) {
         alert('Ошибка AJAX-запроса. Обновите страницу!');
     }
 });
}
</script>

调用失败,页面完全更新。

以下是视图中的更新内容:

<div id="target">
@Html.Partial("~/Views/Partner/PartnerApplicationsPartial.cshtml")
</div>

控制器代码:

[HttpPost]
    public ActionResult PartnerApplications(int[] ApplSort, int[] radio_check_val, int[] myid)
    {
        MordaPartner MrdPrt = new MordaPartner(Server, Request);

        if (Request.IsAjaxRequest())
        {
            var obj = MrdPrt.morda_obj.CookieAuthenticationPartner(Server, Request, Response, MrdPrt.PartnerLogin, MrdPrt.PartnerPassword);
            if (obj != null)
            {
                //alert("ApplSort=" + ApplSort + ";" + "ApplSelectOffer=" + ApplSelectOffer + ";" + "ApplSelectAuction=" + ApplSelectAuction + ";" + "ApplSelectNoOffer=" + ApplSelectNoOffer);

                var objs = from s in MrdPrt.morda_obj.entities.applications where s.application_user_city == obj.partner_city & s.application_blocked != 1 orderby s.application_id ascending select s;

                return Json(new { data = this.RenderPartialViewToString("PartnerApplicationsPartial", objs) });
            }
            else
            {
                return RedirectToAction("Registration");

            }
        }
        else { return RedirectToAction("PartnerApplications"); }
    }

RenderPartialViewToString 取自这里:http://www.c-sharpcorner.com/blogs/7150/implementing-renderpartialviewtostring-in-asp-net-mvc-3.aspx

脚本已加载:

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>

我做错了什么?

【问题讨论】:

  • 问题:在同一个函数 PartnerApplications 中,您返回 JSON 或 HTML,但您的 JavaScript 代码仅处理 HTML。这是你打算做的吗?
  • 是的,确实……我怎样才能只返回 HTML?
  • 顺便说一句,如果是 Ajax 请求,则不能重定向 ajax 请求。您需要返回 JSON 以让您的 Javascript 重定向用户。

标签: asp.net-mvc jquery partial-views


【解决方案1】:

我认为你最简单的解决方案,因为你只是想做部分......

@using( Ajax.BeginForm( "PartnerApplications", 
                        null, 
                        new AjaxOptions() { 
                             HttpMethod = "POST", 
                             InsertionMode = InsertionMode.Replace,  
                             UpdateTargetId = "target", 
                             LoadingElementId = "AjaxSearch" }, 
                        new { id = "UserSearchForm" } ) ) {
    <input type="text" id="id" name="id" placeholder="Enter Search" />
}

这是一种内置于 MVC 中的功能,可以非常轻松地使用部分结果更新元素。

这就是说您想要一个调用PartnerApplications Action 的新Ajax 表单。您希望使用HttpMethod(即POST 请求)调用该操作,并且您希望结果替换(InsertionMode.Replace)target(无论可能是什么)中的现有元素,并且在请求发生时您希望元素 AjaxSearch 可见(这是可选的,但我用它来表明它正在工作)。

这将为您生成所需的 JavaScript,直到您完成一些事情,而不仅仅是返回部分作品 EXCELLENT!

编辑:您还需要更新您的操作...

return Json(new { data = this.RenderPartialViewToString("PartnerApplicationsPartial", objs) });

需要改为....

return PartialView("PartnerApplicationsPartial", objs);

根据评论进行编辑:

如果不更好地了解发送到服务器的数据,我无法告诉您要编写什么来替换该方法。但是,我会查看new AjaxOptions(){} 的属性,因为它有一些额外的属性,允许您指定 JavaScript 函数的名称以调用 Ajax 请求的四种状态(之前/之后/成功/失败)。因此,如果您需要计算某些内容,您可以通过指定将在提交 Ajax 请求之前处理的 JavaScript 函数来执行此操作。

此外,您还需要做更多的工作来获取选定的单选按钮值(尤其是因为您使用的是 jQuery)。

你可以替换...

var radio_check_val=0;

for (i = 0; i < document.getElementsByName('radio').length; i++) {
    if (document.getElementsByName('radio')[i].checked) {
        radio_check_val = document.getElementsByName('radio')[i].value;
    }
}

类似于....

var radio_check_val = $('radio').filter(':checked').val(); 
//this will only work if there is only one set of radio buttons on the page.
//Otherwise you will need to add a name to the selector.

【讨论】:

  • 在这种情况下应该是哪个 Ajax 函数?
  • 我不明白这个问题你能详细说明吗?
  • 我的代码的第一块:
  • 请帮帮我!如何为多个表单或控制器发出 AJAX 请求?
  • @KotFantazer 如果可行,则将答案标记为解决您的问题的答案(这适用于您提出的任何问题)。此外,如果您从多个回复中拼凑出一个解决方案,那么请务必对所有对您有帮助的回复进行投票,并将“最有帮助”的回复标记为解决方案。
【解决方案2】:

你不应该RedirectToAction。而不是重定向返回PartialView('Registration');。

相关问题:
MVC Return Partial View as JSON.
Load PartialView for AJAX and View for non-AJAX request

【讨论】:

  • 投反对票,因为它是link-only answer。此答案未提供实际答案。
  • @ErikPhilips 2012 年的答案是使用 PartialView 而不是 RedirectToAction。那个只有链接的答案怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多