MVC Object(x)不包含blah的定义

时间:2015-12-30 23:23:11

标签: asp.net-mvc

在视图上显示错误,在displaynamefor softwareid行,说模型SoftwareDTO不包含softwareid的定义。我可以在模型中看到它。

型号:

public class SoftwareDTO
{
    public int SoftwareId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

控制器:

    public ActionResult Index()
    {
        List<SoftwareDTO> softwareList = new List<SoftwareDTO>();
        var data = _db.Software.ToList();

        foreach (var sw in data)
        {
            SoftwareDTO software = new SoftwareDTO()
            {
                SoftwareId = sw.SoftwareId,
                Name = sw.Name,
                Description = sw.Description
            };
            softwareList.Add(software);
        };

        return View(softwareList);
    }

查看:

@model List<Request.Models.SoftwareDTO>

    <table class="table">
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.SoftwareId)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Name)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Description)
            </th>
            <th></th>
        </tr>

    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.SoftwareId)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Description)
            </td>

2 个答案:

答案 0 :(得分:0)

因为在剃须刀视图中将其列为一个列表而不是对象SoftwareDTO 我想你错过了foreach

答案 1 :(得分:0)

SoftwareIdSoftwareDTO类的属性。您的视图是对SoftwareDTO对象集合的强类型。因此,您需要遍历模型( SoftwareDTO 的集合)并访问每个项目的SoftwareId

@model List<Request.Models.SoftwareDTO>

<table class="table">
@foreach(var item in Model)
{
   <tr>
      <td>
          @Html.DisplayNameFor(x=> item.SoftwareId)
      </td>
   </tr>
}
</table>

编辑: 根据问题中的修改和提供的评论。

您希望在表格标题中打印属性的显示名称。如果您不想更改从操作方法传递的数据,可以尝试使用

@if (Model.Any())
{
   <table class="table">
      <tr>
          <th>
              @Html.DisplayNameFor(x => Model[0].SoftwareId)
          </th>
      </tr>
      @foreach (var item in Model)
      {
          <tr>
              <td>
                  @Html.DisplayFor(x => item.SoftwareId)
               </td>
          </tr>
      }
   </table>
}

这是使用集合中的第一项及其属性与DisplayNameFor方法一起使用。由于我在渲染表之前有一个if条件来检查至少一个项目,如果你的模型有0项,它甚至不会渲染表。

如果要显示带有标题的空表,则有2个选项。

为表格标题编写HTML标记

  <table class="table">
      <tr>
            <th>
               <label>Software Id</label>
            </th>
      </tr>
      @foreach (var item in Model)
      {
         <tr>
             <td>
                    @Html.DisplayFor(x => item.SoftwareId)
              </td>
         </tr>
        }
  </table>

或者,如果您仍想使用DisplayNameFor辅助方法呈现表标题标签, 创建新的视图模型

public class TableListVm
{
  public List<SoftwareDTO> Items {set;get;}
  public SoftwareDto ItemMeta {set;get;}
  public TableListVm()
  {
     ItemMeta= new SoftwareDto();
  }    
}

在您的GET操作中,将此对象发送到您的视图

public ActionResult Index()
{
   var data = _db.Software.ToList().Select(sw=> new SoftwareDTO { 
                      SoftwareId = sw.SoftwareId,
                      Name = sw.Name,
                      Description = sw.Description
                     }).ToList();
  var vm= new TableListVm { Items = data };
  return View(vm);
}

在您认为强烈输入此视图模型的视图中。

@model TableListVm
<table class="table">
    <tr>
        <th>
                @Html.DisplayNameFor(x => Model.ItemMeta.SoftwareId)
         </th>
     </tr>
     @foreach (var item in Model.Items)
      {
         <tr>
             <td>
                  @Html.DisplayFor(x => item.SoftwareId)
              </td>
         </tr>
       }
 </table>