在ASP.NET中输入标记助手问题

时间:2016-08-24 23:00:21

标签: asp.net-mvc visual-studio-2015 asp.net-core tag-helpers

在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>

2 个答案:

答案 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)