问题陈述:
在MVC中,当我尝试在我的一个剃刀视图(.cshtml)中对某些字段使用LabelFor()而不是DisplayNameFor()时,它给出的错误如下: System.Collections.Generic.IEnumaerable(Test。 Models.TenantModel)不包含TenantID,Name,Adress1的定义.....但它适用于DisplayNameFor() ......为什么???
而不是使用:
@Html.DisplayNameFor(model => model.TenantID)
我想使用:
@Html.LabelFor(model => model.TenantID)
因为我将来自db的viewbag对象传递显示名称作为LabelFor()的第二个参数。
请建议我一些方法吗?
查看代码:
@model IEnumerable<Test.Models.TenantModel>
@{
ViewBag.Title = "Index";
}
<h2>Tenant</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table style="border-collapse: separate; border-spacing: 15px;">
<tr>
@foreach (var item in ViewBag.TenantControl)
{
for (int i = 0; i < ViewBag.TenantLanguage.Count; i++)
{
if (item == "1")
{
if (i == 0)
{
<th style="text-align: center;">
@Html.DisplayNameFor(model => model.TenantID)
</th>
break;
}
}
else if (item == "2")
{
if (i == 1)
{
<th style="text-align: center;">
@Html.DisplayNameFor(model => model.Name)
</th>
break;
}
}
else if (item == "3")
{
if (i == 2)
{
<th style="text-align: center;">
@Html.DisplayNameFor(model => model.Address1)
</th>
break;
}
}
else if (item == "4")
{
if (i == 3)
{
<th style="text-align: center;">
@Html.DisplayNameFor(model => model.Address2)
</th>
break;
}
}
else if (item == "5")
{
if (i == 4)
{
<th style="text-align: center;">
@Html.DisplayNameFor(model => model.Address3)
</th>
break;
}
}
else if (item == "6")
{
if (i == 5)
{
<th style="text-align: center;">
@Html.DisplayNameFor(model => model.CountryID)
</th>
break;
}
}
else if (item == "7")
{
if (i == 6)
{
<th style="text-align: center;">
@Html.DisplayNameFor(model => model.StateID)
</th>
break;
}
}
else if (item == "8")
{
if (i == 7)
{
<th style="text-align: center;">
@Html.DisplayNameFor(model => model.CityID)
</th>
break;
}
}
else if (item == "9")
{
if (i == 8)
{
<th style="text-align: center;">
@Html.DisplayNameFor(model => model.Pin)
</th>
break;
}
}
else if (item == "10")
{
if (i == 9)
{
<th style="text-align: center;">
@Html.DisplayNameFor(model => model.Phone)
</th>
break;
}
}
}
}
<th></th>
</tr>
@foreach (var item in Model)
{
<tr>
@foreach (var itm in ViewBag.TenantControl)
{
if (itm == "1")
{
<td style="text-align: center;">
@Html.DisplayFor(modelItem => item.TenantID)
</td>
}
else if (itm == "2")
{
<td style="text-align: center;">
@Html.DisplayFor(modelItem => item.Name)
</td>
}
else if (itm == "3")
{
<td style="text-align: center;">
@Html.DisplayFor(modelItem => item.Address1)
</td>
}
else if (itm == "4")
{
<td style="text-align: center;">
@Html.DisplayFor(modelItem => item.Address2)
</td>
}
else if (itm == "5")
{
<td style="text-align: center;">
@Html.DisplayFor(modelItem => item.Address3)
</td>
}
else if (itm == "6")
{
<td style="text-align: center;">
@Html.DisplayFor(modelItem => item.CountryModel.Name)
</td>
}
else if (itm == "7")
{
<td style="text-align: center;">
@Html.DisplayFor(modelItem => item.StateModel.Name)
</td>
}
else if (itm == "8")
{
<td style="text-align: center;">
@Html.DisplayFor(modelItem => item.CityModel.Name)
</td>
}
else if (itm == "9")
{
<td style="text-align: center;">
@Html.DisplayFor(modelItem => item.Pin)
</td>
}
else if (itm == "10")
{
<td style="text-align: center;">
@Html.DisplayFor(modelItem => item.Phone)
</td>
}
}
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.TenantID }) |
@Html.ActionLink("Details", "Details", new { id = item.TenantID }) |
@Html.ActionLink("Delete", "Delete", new { id = item.TenantID })
</td>
</tr>
}
</table>
控制器代码:
public ActionResult Index()
{
var result = GetTenantData();
return View(result);
}
public IEnumerable<TenantModel> GetTenantData()
{
return (from t in db.Tenant.AsEnumerable()
join c in db.Country.AsEnumerable() on t.CountryID equals c.CountryID
join s in db.State.AsEnumerable() on t.StateID equals s.StateID
join ct in db.City.AsEnumerable() on t.CityID equals ct.CityID
orderby t.Name
select new TenantModel()
{
TenantID = t.TenantID,
Name = t.Name,
Address1 = t.Address1,
Address2 = t.Address2,
Address3 = t.Address3,
CountryID = t.CountryID,
StateID = t.StateID,
CityID = t.CityID,
CountryModel = c,
StateModel = s,
CityModel = ct,
Pin = t.Pin,
Phone = t.Phone,
});
}
答案 0 :(得分:1)
我真的不知道这两个函数之间有什么区别,但是当你调用DisplayNameFor(model =&gt; ...)时,模型的类型是Test.Models.TenantModel,而使用LabelFor(model =&gt; ; ...),它是IEnumerable(这对我来说更有意义,因为那是你在视图中声明的内容)。
如果你真的想让它在你的视图中工作,你可以使用
Html.LabelFor(model => model.FirstOrDefault().TenantID)
但是如果你的Viewbag中有一个空列表,我不确定它是否正常工作。
答案 1 :(得分:0)
DisplayNameFor没有任何重载方法
public static MvcHtmlString DisplayNameFor<TModel, TValue>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression
)
虽然LabelFor有,但请检查: http://msdn.microsoft.com/en-us/library/system.web.mvc.html.labelextensions.labelfor%28v=vs.118%29.aspx