使用部分视图,javascript和viewbag foreach时出错

时间:2014-11-27 14:17:25

标签: javascript jquery asp.net-mvc asp.net-mvc-4 viewbag

我正在尝试使用JavaScript加载局部视图,反过来局部视图将有一个View Bag“,以循环播放。 一切都运行良好,直到我尝试渲染部分视图我得到一个“对象”错误,如果我删除View包循环部分视图加载

控制器

[HttpPost]
        public ActionResult ServiceDetails(int id )
        {
            int count = 0;

           var m = from c in db.ServiceCategoryFields
                    where c.serviceTypeID == id
                    select c;
            ViewBag.count  = count;
            ViewBag.m = m.ToList();
            return PartialView(m.ToList());
        }

部分视图

<table style ="width:100% ">
     <tr>
     @foreach (var image in (List<String>)ViewBag.m)
    {
        <td>
           @image
        </td>
     }  

  </tr>

JS档案

type: "POST",
            success: function (data) {

                display.html('');
                display.html(data);
            },
            error: function (reponse) {
                alert("JS Error : " + reponse.toString());
            }

1 个答案:

答案 0 :(得分:1)

快速解决方案

根据您的控制器代码

[HttpPost]
public ActionResult ServiceDetails(int id )
{
    int count = 0;

    var m = from c in db.ServiceCategoryFields
            where c.serviceTypeID == id
            select c;
    ViewBag.count  = count;
    ViewBag.m = m.ToList();
    return PartialView(m.ToList());
}

ViewBag.m将是List<ServiceCategoryField>的一个实例,但您会在局部视图中将其转换为List<string>

@foreach (var image in (List<String>)ViewBag.m)

所以你得到了错误。假设PropertyNameServiceCategoryField的属性,其中包含您要在<td>代码中显示的值,则需要将ViewBag.m转换为List<ServiceCategoryField>查看如下

<table style ="width:100% ">
    <tr>
    @foreach (var image in (List<ServiceCategoryField>)ViewBag.m)
    {
        <td>
           @image.PropertyName
        </td>
    }  

  </tr>

替代解决方案

之前的解决方案需要转换ViewBag.m,如果将ViewBag.m转换为错误的类型,则可能会产生运行时错误。您可以使用此替代解决方案避免在局部视图中进行转换。

要做的第一件事是创建一个将由部分视图使用的模型类,让我们说类名是ServiceDetailsViewModel,它有Count和{{1}属性

Images

创建public class ServiceDetailsViewModel { public int Count { get; set; } public List<string> Images { get; set; } } 的实例,分配属性,并将ServiceDetailsViewModel传递给控制器​​中的局部视图。我假设model是一个字符串,PropertyName是部分视图中的c.PropertyName来自

的地方
image

使用部分视图代码

顶部的以下语法将[HttpPost] public ActionResult ServiceDetails(int id ) { int count = 0; var m = from c in db.ServiceCategoryFields where c.serviceTypeID == id select c.PropertyName; ServiceDetailsViewModel model = new ServiceDetailsViewModel(); model.Count = count; model.Images = m.ToList(); return PartialView(model); } 设置为模型
ServiceDetailsViewModel

并循环浏览@model ServiceDetailsViewModel ,如下所示

Model.Images