2016-08-24 48 views
0

在ASP.NET視圖,如下圖所示,我收到的特定錯誤排隊<input asp-for="StateName" /> 錯誤'List<GrantsViewModel>' does not contain a definition for 'StateName'輸入標記助手問題ASP.NET

注意:查看假設在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

你爲什麼要使用ASP的助手在剃刀,如果你使用.NET MVC的工作? – Jecoms

+2

您有一個表單,但是您正在從數據庫加載信息。如果你只想顯示信息,那麼你不應該有一個表格。如果你想通過表單收集新的數據,那麼你的表單應該與載入的數據分開。 – Jecoms

+0

@Jecoms 1.我試圖使用新的MVC6功能[HTML標籤助手](https://docs.asp.net/en/latest/mvc/views/tag-helpers/intro.html),特別是[輸入標籤助手](http://www.davepaquette.com/archive/2015/05/13/mvc6-input-tag-helper-deep-dive.aspx)2.這是一個應用程序,客戶希望與預加載的數據(HttpGet),並讓用戶能夠修改該數據(因此輸入標籤),然後保存數據(因此將表單發回HttpPost)。 – nam

回答

0
@Html.DisplayNameFor(model => model.StateName) 

在此行中,您嘗試從model引用的對象訪問屬性StateName。除了模型引用類型爲List<T>的對象,它沒有屬性StateName。

要訪問StateName,您需要提供您正在訪問的列表的哪個元素,例如以下(假設您不需要迭代,因爲您只是獲取列標題)。

@Html.DisplayNameFor(model => model[0].StateName) 

要正確引用的元素在ASP-的幫手,使用

<input asp-for="@item.StateName" /> 
+0

感謝您指出' .. <\th>'中的錯誤。我在上面的視圖中進行了修正。但是我在帖子中發佈的錯誤是在[Helper tag](http://www.davepaquette.com)中使用'asp-for'屬性的' /archive/2015/05/13/mvc6-input-tag-helper-deep-dive.aspx)。 – nam

+0

你遇到了同樣的問題。 asp-for幫助標記正在尋找模型中的屬性,而List沒有StateName。 – Kolichikov

+0

那麼,我該如何改變''? ''不起作用。 – nam

0

你想引用屬性的名稱時使用FirstOrDefault()。即使您的IEnumerable/List模型爲空,這仍然可以使用反射來獲取顯示名稱。

@Html.DisplayNameFor(model => model.FirstOrDefault().StateName) 

取而代之的是Statename的ASP-標籤,這裏是剃刀幫手輸入:

@Html.EditorFor(modelItem => item.StateName) 

我有點困惑,爲什麼你在表單中有這樣的表,如果你」只想顯示你的信息列表。如果你澄清,我可以根據你的意圖更好地回答。

如果你只是想這個數據顯示,然後用DisplayFor()像你這樣的GrantNo列:

@Html.DisplayFor(modelItem => item.StateName)