在ASP.NET视图中,如下所示,我收到特定于行<input asp-for="StateName" />
的错误
的错误:
'List<GrantsViewModel>' does not contain a definition for 'StateName'
注意:视图应在HTML表格列中显示不同的州名称。
控制器:
public class DbTestController : Controller
{
private MyProjContext _context;
public DbTestController(MyProjContext context)
{
_context = context;
}
public IActionResult GrantNumbers()
{
var qryVM = from s in _context.StateNames
join g in _context.AnnualGrants on s.StateNumber equals g.StateNumber into sg
from r in sg.DefaultIfEmpty()
select new GrantsViewModel() { StateNumber = s.StateNumber,StateName= s.State, GrantNo= (r == null ? String.Empty : r.GrantNo), FiscalYear = (r == null ? 1900 : r.FiscalYear) };
return View(qryVM.ToList());
}
}
视图模型:
public class GrantsViewModel
{
public int GrantNo_Id { get; set; }
public string StateNumber { get; set; }
public string StateName { get; set; }
public string GrantNo { get; set; }
public int FiscalYear { get; set; }
}
查看:
@model List<MyProjet.Models.GrantsViewModel>
<form asp-controller="DbTest" asp-action="GrantNumbers" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post">
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.First().StateName)
</th>
<th>
@Html.DisplayNameFor(model => model.First().GrantNo)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
<input asp-for="StateName" />
</td>
<td>
@Html.DisplayFor(modelItem => item.GrantNo)
</td>
<td></td>
</tr>
}
</tbody>
</table>
<button type="submit" class="btn btn-default">Save</button>
</form>
答案 0 :(得分:0)
@Html.DisplayNameFor(model => model.StateName)
在此行中,您尝试从StateName
引用的对象访问属性model
。除了模型引用类型List<T>
的对象,它没有属性StateName。
要访问StateName,您需要提供要访问的列表中的哪个元素,例如以下内容(假设您不需要迭代,因为您只是获取列标题)。
@Html.DisplayNameFor(model => model[0].StateName)
要在asp-for helper中正确引用元素,请使用
<input asp-for="@item.StateName" />
答案 1 :(得分:0)
您希望在引用属性名称时使用FirstOrDefault()。即使您的IEnumerable / List Model为空,这仍然可以使用反射获取显示名称。
@Html.DisplayNameFor(model => model.FirstOrDefault().StateName)
而不是StateName的asp-tag,这里是输入的Razor Helper:
@Html.EditorFor(modelItem => item.StateName)
如果您想要显示您的信息列表,我有点担心您为什么要在表格中使用此表格。如果你澄清,我可以根据你的意图更好地回答。
如果您只想显示此数据,请像使用GrantNo列一样使用DisplayFor():
@Html.DisplayFor(modelItem => item.StateName)