的ICollection<>在ICollection内<>在Razor中 - 无法检索模型名称

时间:2015-09-17 07:41:34

标签: c# asp.net-mvc razor ienumerable icollection

我想知道如何解决这个问题。我正在开发一个ASP.NET MVC应用程序

我有 models

public class SearcherString
{
    public int ID { get; set; }
    public string Description { get; set; }
    public virtual ICollection<Path> Path { get; set; 
    public SearcherString()
    {
        Path = new List<Path>();
    }
}

public class Path
{
    public int ID { get; set; }
    public int CategoryID { get; set; }
    public string CategoryName { get; set; }
}

我在 Controller 中传递它(我正在将我的模型写入我的数据库,然后我正在检索它)

public ActionResult Index()
{
    return View(db.SearchersString.ToList()
}

我有一个 View

@model IEnumerable<App.Models.SearcherString>
  

问题出在我的视图中,我无法显示路径模型中的名称   ( CategoryID CategoryName

我试着这样做:

<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Description)
        </th>
        @foreach (var item in Model)
        {
            foreach (var path in item.Path)
            {
                <th>
                    @Html.DisplayName(path.CategoryID.ToString())
                </th>
                <th>
                    @Html.DisplayName(path.CategoryName)
                </th>
            }
        }
        <th></th>
    </tr>

    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Description)
            </td>
            @foreach (var path in item.Path)
            {
                <td>
                    @Html.DisplayFor(modelItem => path.CategoryID)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => path.CategoryName)
                </td>
            }
            <td>
                @Html.ActionLink("Edit", "Edit", new { id = item.ID }) |
                @Html.ActionLink("Details", "Details", new { id = item.ID }) |
                @Html.ActionLink("Delete", "Delete", new { id = item.ID })
            </td>
        </tr>
    }
</table>

但我只有: enter image description here

有人可以帮我解决这个问题吗?

  

编辑:

有没有办法在这里将Html.DisplayName更改为Html.DisplayNameFor

@Html.DisplayName(path.CategoryID.ToString())

2 个答案:

答案 0 :(得分:1)

您应该在查询中包含导航属性:

public ActionResult Index()
{
    return View(db.SearchersString.Include(c=>c.Path).ToList()
}

答案 1 :(得分:1)

您的模型不正确。

public int PathID {get; set;}
public virtual Path Path{get; set;}

这不是财产。这被视为一种方法,一种特殊的方法。它是一个构造函数。创建一个EMPTY的Path对象。

如果你想拥有一对多的关系。您必须使用该属性并添加ID属性。

public ActionResult Index(){


  return View(db.SearchersString.Include(c=>c.Path).ToList();
}

现在你有一个延迟加载属性,它会自动将Path类的ID属性保存到SearchString模型属性PathID中。

要获取PathID,如果您正在使用EntityFramework,则需要调用include函数,这很可能就是这种情况。

module.exports = {

 types: {

         uniqueEmail:function(value) {
  return uniqueEmail;         
       },
   password: function(password) {
  return password === this.passwordConfirmation;
       }
   },
     schema:true,

      attributes: {

  firstname: {
        alpha:true,
        required: true
      },
  lastname:{
       alpha:true,
       required: true

  },

  username:{
      type:'string',

      unique: true,

      required:true

  },
  password:{

       type:'string',
        required:true,
        password:true

    },
  age:{
      numeric:true,
       required: true
      },
  gender:{
       alpha:true,
       required: true


  },
  email:{

      type:'email',
      required: true,
      unique:true,
      uniqueEmail:true

  },

  passwordConfirmation: {
  type: 'string'
  },

  department:{
        model: 'Department',
         required: true

    },

  qualifications:{

        collection: 'Qualification',
        via: 'person'

  },

  loggedIn: {
  type: 'boolean',
  defaultsTo: 0,
  required: true
}