2015-09-17 3 views
0

Мне интересно, как решить проблему. Я разрабатываю приложение ASP.NET MVCICollection <> внутри ICollection <> в Razor - невозможно получить имена моделей

У меня есть 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> 

Проблема заключается в том, на мой взгляд, я не могу отобразить имена из Path модели (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

Может ли кто-нибудь помочь мне с этой проблемой?

Edit:

Есть ли способ изменить Html.DisplayName к Html.DisplayNameFor здесь?

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

Вы уверены, что 'Path' фактически содержит некоторые элементы –

+0

я добавил точку останова в строке ** @ Еогеасп (вар элемент в модели) ** и он не будет входить в это ** Еогеасп ** –

+0

Поскольку ваш «Путь» - пустая коллекция –

ответ

1

Вы должны включить свойство навигации по Вашему запросу:

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

Большое спасибо за помощь! –

1

Ваша модель неверна.

public SearcherString() 
{ 
    Path = new List<Path>(); 
} 

Это не собственность. Это рассматривается как метод, специальный. И это конструктор. Это создает объект Path, который является ПУСТОЙ.

Если вы хотите иметь отношения друг к другу. Вам нужно будет использовать свойство для этого и добавить свойство ID.

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

Теперь у вас есть отложенная загрузка свойство, которое будет автоматически сохранять свойство идентификатора класса Path в вашу SearchString модели недвижимости PathID.

Чтобы получить PathID, вам нужно будет вызвать функцию include, если вы используете EntityFramework, что, скорее всего, имеет место.

public ActionResult Index(){ 


    return View(db.SearchersString.Include(c=>c.Path).ToList(); 
} 
Смежные вопросы