我正在尝试使用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());
}
答案 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)
所以你得到了错误。假设PropertyName
是ServiceCategoryField
的属性,其中包含您要在<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