使用单个ajax请求呈现json数据和部分视图

时间:2014-04-02 12:37:28

标签: jquery ajax asp.net-mvc json

下面给出的代码向控制器发送ajax请求。

 if (btid === '01') {
                var allData = {
                    "sessionName": $('#sessionname').val(),
                    "foundStudent": $('#studentId').val(),
                    "code":btid
                }
                var mySession = JSON.stringify(allData);
                $.ajax({
                    type: "POST",
                    url: '@Url.Action("RenderView", "ManualFeesCollection")',
                    contentType: "application/json; charset=utf-8",
                    data: mySession,
                    success: function (data) {
                          $('#maindiv').html('')
                          $('#maindiv').html(data)
                          $.each(data.myMonths, function (index, item) {
                           //Here I want to access myMonths as Json
                        })
                    },
                })

以下是Controller Action。

public ActionResult RenderView(int code,long foundStudent,int sessionName)
        {
            var months = //get some months
            var myMonths= (from w in months
                        select new
                        {
                            w.Month
                        });// Want access this data in ajax success function
            return PartialView("MonthwiseFees",myMonths);

    }

但问题是我在#maindiv中获得了观点,但没有得到

  

myMonths

作为json,在ajax的成功函数中。我需要用那些myMonth来做一些事情。目前我发送两个ajax请求(在另一个成功的时候)来完成。但是我希望我能用一个ajax请求来做。感谢花时间在我的问题上。< / p>
  • Update1:​​部分视图代码

    {
    
    <tr>
        <td>
         @x
        </td>
        <td>
          @months[no]
        </td>
        <td>
            @Html.CheckBox(" " + @x, new { @class="check",id="check"})
            @Html.Label(" ", new { @class="lbl"})
         </td>
    </tr>
    x = x + 1;
    

    }

                     

                 <input type="button" class="mybutton btn btn-small btn-primary" value="Show >"/>
    
            </div>
        <div class="span7" id="classwiseheads">
            </div>
    </div>
    

3 个答案:

答案 0 :(得分:2)

您无法针对单个请求发送text/htmlapplication/json。你可以发一个。

如果从控制器返回PartialView,则内容类型将设置为text/html。但是你仍然可以将JSON渲染为局部视图的一部分。

public ActionResult RenderView(int code,long foundStudent,int sessionName)
{
    var months = //get some months
    var myMonths= (from w in months
                select new
                {
                    w.Month
                });
        ViewBag.Months=myMonths;
    return PartialView("MonthwiseFees");

}

然后在你的局部视图中

<script>
var myJSArray=@Html.Raw(JSON.Encode(ViewBag.Months)
</script>

的jQuery

success: function(data) {
    $('#maindiv').html('')
    $('#maindiv').html(data)
    $.each(myJSArray, function(index, item) {
        //myJSArray will be available in window scope now
    })
}

更新:基于更新的问题

控制器

public ActionResult RenderView(int code,long foundStudent,int sessionName)
{
    var months = //get some months
    var myMonths= (from w in months
                select new
                {
                    w.Month
                });        
    return PartialView("MonthwiseFees",myMonths);

}

当我为Html.CheckBox传递true时,这将检查所有复选框。这需要使用模型和月份数组来确定

@model List<string>

@using System.Globalization;

@{

    Layout = null;
    string[] months =DateTimeFormatInfo.CurrentInfo.MonthNames;
    var countMonths=months.Count();
    int x = 1;
}
<div>

@for (int no=0;no<countMonths-1;no++)
{

    <tr>
        <td>
         @x
        </td>
        <td>
          @months[no]
        </td>
        <td>
            //determine true/false by comparing months and Model
            @Html.CheckBox(" " + @x, model.Contains(months[x]), new { @class="check",id="check"})           
         </td>
    </tr>
    x = x + 1;
}
</div>

的jQuery

success: function(data) {
    $('#maindiv').html('');
    $('#maindiv').html(data);        
}

答案 1 :(得分:1)

让我们从您的以下代码开始

var myMonths= (from w in months
                        select new
                        {
                            w.Month
                        });

这里我假设你的myMonths充满了整数列表。我建议在上面的代码中添加.ToList();。现在它变成了:

var myMonths= (from w in months
                        select new
                        {
                            w.Month
                        }).ToList();

现在让我们检查你的jquery代码,你的ajax成功方法看起来像这样

success: function(data) {
    $('#maindiv').html('')
    $('#maindiv').html(data)
    $.each(data.myMonths, function(index, item) {
        //Here I want to access myMonths as Json
    })
}

在这里你写$('#maindiv').html(data),这里的数据是整数的集合(月的集合),。html()不会那样工作。

现在,因为您正在使用此ajax调用来仅获取JSON值。我没有看到为此返回部分视图的必要性。您的行动中的退货声明可能如下所示:

return Json(myMonths, JsonRequestBehavior.AllowGet);

现在当您使用以下jquery时,您将能够根据需要每个月访问:

$.each(data, function(index, item) {
    // here is your month in the 'item' variable.
    $('#maindiv').html(item)
})

更新1:

我看到您正在尝试使用ajax调用加载部分视图,然后还使用该ajax调用中返回的数据。

为什么不使用@Html.Partial@Html.Actionhow to)加载部分视图。理想情况下,部分视图应该调用您的操作,返回JSON数据,然后您可以相应地使用它。

更新2:

您的最新评论说

  
    

一页加载我不需要该视图。我需要点击某个按钮上的视图。

  

这可能会有所帮助:https://stackoverflow.com/a/11964905/1182982

答案 2 :(得分:0)

感谢Murali Murugesanyasser寻求帮助

我使用了Murali Murugesan的概念,通过在ViewBag.But中发送必要的数据,因为我的部分视图是Not Strongly Typed,因此我需要使用javascript。

我编辑了我的控制器Action,如下所示

var months = fcDetailsService.GetStudentWiseCollectionDetail(foundStudent, sessionName, "01");
            var data = (from w in months
                        select new
                        {
                            w.Month

                        });
            ViewBag.Months = JsonConvert.SerializeObject(data);
            if (data != null)
            {
                return PartialView("MonthwiseFees", data);
            }
            else
                return Json("MonthwiseFees");

然后在我的javascript中,我在下面做了

$(function () {
        var i = 0;
        var myarray = new Array();
        myarray =@Html.Raw(@ViewBag.Months)
            $('.check').each(function () {
                for (var x = 0; x < myarray.length; x++)
                {
                        var me = (JSON.stringify(myarray[x].Month))
                        if ($.trim(this.name) === $.trim(me)) {
                            $(this).prop("checked", true)
                            $(this).attr("disabled", true)
                            return true;
                    }
                }
            });
    });