ajax请求返回部分视图

时间:2012-10-08 20:11:41

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

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

<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>

我做错了什么?

2 个答案:

答案 0 :(得分: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,直到您完成除了简单返回部分工作之外的其他内容!

编辑:您还需要更新您的行动......

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

需要改为......

return PartialView("PartnerApplicationsPartial", objs);

基于评论的编辑:

在不知道发送到服务器的数据的情况下,我无法告诉您要写什么来替换该方法。然而,我会查看new AjaxOptions(){}的属性,因为它有一些额外的属性,允许您指定要在Ajax请求的四个状态(之前/之后/成功/失败)上调用的JavaScript函数的名称。因此,如果您需要计算某些内容,可以通过指定在提交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.

答案 1 :(得分:-1)

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

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