Как использовать две модели в одном представлении? - PullRequest
3 голосов
/ 23 апреля 2020

Я пытаюсь использовать переменные, созданные в двух разных моделях, в одном представлении. Я использую метод View Model для этого. Однако, на мой взгляд, переменные в моделях не распознаются, и выдают ошибку;

"CategoryItemViewModel" не содержит определения для "результата" и не имеет доступного метода расширения "результат", принимающего первый аргумент тип 'CategoryItemViewModel' может быть найден (вам не хватает директивы using или ссылки на сборку? "

Ниже вы можете увидеть код, который у меня есть для двух исходных моделей;

Категория Модель:

public class Category
{
   public string result { get; set; }
   public char[] delimiterChar { get; set; }
   public Array userData { get; set; }
}

Модель изделия:

public class Item
{                      
   public Array userDataItems { get; set; }
}

В-третьих, я создал модель представления с намерением связать две вышеупомянутые модели в одну,

ViewModel:

public class CategoryItemViewModel
{
   public Item ItemList { get; set; }
   public Category CategoryList { get; set; }
}

И, наконец, у меня есть один контроллер, который отвечает за объединение необходимых моделей, а также за инициализацию и возврат их в модель представления, чтобы их можно было использовать в представлении:

public ActionResult GetCategoryItem()
{
   CategoryItemViewModel CIVM = new CategoryItemViewModel();
   CIVM.ItemList = GetItemModel();
   CIVM.CategoryList = GetCategoryModel();
   return View(CIVM);             
}

public Category GetCategoryModel()
{
   var dataFile = Server.MapPath("~/App_Data/Category.txt");
   Category cModel = new Category()
   {
     result = "",
     delimiterChar = new[] { ',' },
     userData = System.IO.File.ReadAllLines(dataFile) //Category Text File
   };

   return cModel;
}

public Item GetItemModel()
{
   var dataFileItems = Server.MapPath("~/App_Data/Category.txt");
   Item iModel = new Item()
   {
      userDataItems = System.IO.File.ReadAllLines(dataFileItems) //Items Text File
   };

   return iModel;
}

Обратите внимание, что я использую пространства имен для моего контроллера следующим образом:

Пространства имен контроллера:

using System.Web.Mvc;
using u18043039_HW3.ViewModel;
using u18043039_HW3.Models;

Просмотр пространств имен:

@using u18043039_HW3.Models
@using u18043039_HW3.Controllers
@model u18043039_HW3.ViewModel.CategoryItemViewModel

Наконец, мой взгляд:

 @Model.result
        @if (Model.result == "")
        {
            int count = 0;

            foreach (String dataLine in Model.userData)
            {

                string countString = count.ToString();
                string target = "dataLine" + countString;
                string trigger = "#" + target;

                <p>
                    <a data-toggle="collapse" href="@trigger" role="button" aria-expanded="false" aria-controls="collapseExample">
                        @dataLine.Split(Model.delimiterChar)[0]
                    </a>

                    <button class="btn" onclick="location.href='@Url.Action("Items", "Items")'" id="@dataLine.Split(Model.delimiterChar)[1]"><i class="fas fa-plus secondaryPlusIcon" id="@dataLine.Split(Model.delimiterChar)[1]"></i></button>
                    <button class="btn" id="@dataLine.Split(Model.delimiterChar)[1]"><i class="far fa-edit secondaryEditIcon" id="@dataLine.Split(Model.delimiterChar)[1]"></i></button>
                    <button class="btn" id="@dataLine.Split(Model.delimiterChar)[1]"><i class="far fa-trash-alt secondaryDeleteIcon" id="@dataLine.Split(Model.delimiterChar)[1]"></i></button>
                </p>



                <div class="collapse" id="@target">
                    <div class="card card-body w-25 p-3 collapsible" id="@dataLine.Split(Model.delimiterChar)[1]">
                        <!-- Card Elements here -->
                    </div>
                </div>

                count++;
            }
        }

Ответы [ 3 ]

2 голосов
/ 23 апреля 2020

Вы неправильно определяете @Model. Модель представляет CategoryItemViewModel, у которой нет свойства результата. Вы должны обновить @Model до @Model.CategoryList.result.

Персональные настройки, я бы использовал @Model только для ввода модели, а затем указывал свойство там, где это необходимо. IE

@Model

Html.TextBoxFor(x => x.CategoryList.result)
2 голосов
/ 23 апреля 2020

Ваша модель должна иметь тип CategoryItemViewModel

@model CategoryItemViewModel

Затем вам необходимо получить доступ к свойству result через переменную CategoryList в модели представления, например:

@Model.CategoryList.result
2 голосов
/ 23 апреля 2020

В вашем представлении Model представляет CategoryItemViewModel, чтобы в результате go сначала вам нужно было получить доступ к CategoryList.

Таким образом, вы должны сделать @Model.CategoryList.result

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...