2015-06-16 3 views
2

У меня есть модель в моем приложении ASP.NET MVC:Проходя сложный массив из контроллера для просмотра ASP.NET MVC

public class SearchArrayModel 
{ 
    public long ID { get; set; } 
    public string Name { get; set; } 
    public struct AttribStruct 
    { 
     public string AttribName { get; set; } 
     public string[] AttribValues { get; set; } 
    } 
    public AttribStruct[] AttribStructTable { get; set; } 
} 

В контроллере я заполняющий его некоторые данные из WebAPI (процесс наполнения хорошо), Я создал массив SearchArrayModel, потому что у меня есть много элементов для заполнения из webAPI (это веб-сайт с сайта, похожий на ebay), например, некоторые телефоны с его именами и атрибуты, которые вы обычно видите на сайте аукциона).

SearchArrayModel[] src = new SearchArrayModel[x]; 
{ 
    //filling the fields 
} 

А на конце ActionResult у меня есть:

return View(src); 

//Visual Studio tells me that it is a "SearchArrayModel[] src" 

Я также просматривать, где я хочу, чтобы получить и отобразить данные:

@model allegrotest.Models.SearchArrayModel 
@using (Html.BeginForm()) 
{  
    <h2>@Model.AttribStructTable[1].AttribName</h2>  
    <h3>@Model.AttribStructTable[1].AttribValues[1]</h3> 
    //indexes of arrays are just for testing, if all will be good I will write a loop   
} 

Но когда я м Начало приложения У меня есть ошибка:

The model item passed into the dictionary is of type 'allegrotest.Models.SearchArrayModel[]', but this dictionary requires a model item of type 'allegrotest.Models.SearchArrayModel

Я знаю, что это сложный массив, и я не знаю, как передать этот массив из Controller в View.

Я пытался писать в Вид:

@model allegrotest.Models.SearchArrayModel[] 

, но тогда я не могу попасть в поле внутри @model

ответ

2
@model allegrotest.Models.SearchArrayModel[] 

, который является массивом.Таким образом, вы можете попробовать

@foreach (SearchArrayModel item in Model) 
{ 
    <h2>@item.AttribStructTable[1].AttribName</h2>  
    <h3>@item.AttribStructTable[1].AttribValues[1]</h3> 
    .. 
} 

или

@for (int i = 0; i < Model.Length; ++i) 
{ 
    <h2>@Model[i].AttribStructTable[1].AttribName</h2>  
    <h3>@Model[i].AttribStructTable[1].AttribValues[1]</h3> 
    .. 
} 
+0

Ваше второе решение работает. Когда я попытался написать 1-й (с помощью foreach), я не могу получить доступ к «SearchArrayModel» в моем представлении –

3

Исходя из предположения, что «процесс заполнения в порядке» неправильно.

Примечание: Я сделал это предположение, потому что я вижу, что вы не заинтересованы в Model[index], и я заметил в SearchArrayModel[x]; { };.

SearchArrayModel src = new SearchArrayModel 
{ 
    AttribStructTable = new SearchArrayModel.AttribStruct[] 
    { 
     new SearchArrayModel.AttribStruct{AttribName = "0Nume", AttribValues = new []{"0one", "0two"}}, 
     new SearchArrayModel.AttribStruct{AttribName = "1Nume", AttribValues = new []{"1one", "1two"}}, 
    }, 
    Name = "SearchArrayName" 
}; 

Ваш взгляд нормально и работает

@model allegrotest.Models.SearchArrayModel 
@using (Html.BeginForm()) 
{  
    @foreach(var attribStruct in @Model.AttribStructTable) 
    { 
     <h2>@attribStruct.AttribName</h2>  
     @foreach(var attribValue in attribStruct.AttribValues) 
     { 
       <h3>@attribValues</h3> 
     } 
    }  
} 

Другим решением будет сделать modelof View, чтобы быть IEnumerable и в действии вы можете сделать return View(src.ToList());

Рекомендуем также Я заметил, что когда я проверил ваш код, у вас есть Model.AttribStructTable, что неверно, потому что ваш Model является сборником ion, и вы должны указать, какой элемент из модели вы хотите отобразить Model[index] (не представляется возможным с IEnumerable), Model.First() или вы можете выполнять итерацию по коллекции.

@model IEnumerable<allegrotest.Models.SearchArrayModel> 
@using (Html.BeginForm()) 
{ 
    @foreach(var attribStruct in @Model.First().AttribStructTable) 
    { 
     <h2>@attribStruct.AttribName</h2>  
     @foreach(var attribValue in attribStruct.AttribValues) 
     { 
       <h3>@attribValues</h3> 
     } 
    } 
} 

Если перебрать все элементы из Model будет выглядеть следующим образом

@model IEnumerable<allegrotest.Models.SearchArrayModel> 
@using (Html.BeginForm()) 
{ 
    @foreach(var searchArrayModel in Model) 
    { 
     @foreach(var attribStruct in @searchArrayModel) 
     { 
      <h2>@attribStruct.AttribName</h2>  
      @foreach(var attribValue in attribStruct.AttribValues) 
      { 
        <h3>@attribValues</h3> 
      } 
     } 
    } 
} 
+0

Я сделал правку в моем посте, почему я создал массив –

+0

@karolinka теперь я понимаю. Вам нужен только первый элемент или вы хотите перебирать «Модель»? – adricadar

+0

Я хочу перебрать модель, чтобы отобразить ВСЕ элементы из моего массива, я написал индексы «1» только для тестирования –

Смежные вопросы