Как передать значения словаря из Controller в View? - PullRequest
0 голосов
/ 08 февраля 2019

Я создаю периодическую таблицу, и я создал словарь в контроллере дома с именем dictionaryOfElements, в котором атомный номер элемента является ключом, а атомный номер элемента, символ, имя и вес - значениями.Мне нужна помощь в отображении всех значений словаря для представления из ViewModel.

Ниже представлена ​​созданная мной модель:

public class Elements
{
    public int AtomicNumber { get; set; }
    public string Symbol { get; set; }
    public string Name { get; set; }
    public string Weight { get; set; }

    public Elements()
    {
        //
    }

    public Elements(int atomic, string sym, string name, string weight)
    {
        this.AtomicNumber = atomic;
        this.Symbol = sym;
        this.Name = name;
        this.Weight = weight;
    }
}

Домашний контроллер, в котором я объявил словарь

public class HomeController : Controller
{
    Elements Hydrogen = new Elements(1, "H", "Hydrogen", "1.008");
    Elements Helium = new Elements(2, "He", "Helium", "4.0026");
    Elements Lithium = new Elements(3, "Li", "Lithium", "6.94");
    Elements Beryllium = new Elements(4, "Be", "Beryllium", "9.0122");
    Dictionary<int, Elements> dictionaryOfElements = new Dictionary<int, Elements>();

    // GET: Home
    public ActionResult DisplayElements()
    {          
        dictionaryOfElements.Add(Hydrogen.AtomicNumber, Hydrogen);
        dictionaryOfElements.Add(Helium.AtomicNumber, Helium);
        dictionaryOfElements.Add(Lithium.AtomicNumber, Lithium);
        dictionaryOfElements.Add(Beryllium.AtomicNumber, Beryllium);

        return View(dictionaryOfElements);
    }

    public ActionResult Index()
    {
        return View();
    }
}  

Модель представления для видов

public class ElementsOfPeriodicTable
{
    public Elements elements { get; set; }
    public Dictionary<int, Elements> dictionaryOfElements { get; set; }
}

Пока мой вид выглядит так:

    @model PeriodicTable.View_Model.ElementsOfPeriodicTable
@{
    ViewBag.Title = "DisplayElements";
    Layout = "~/Views/Shared/_LayoutPage1.cshtml";
}

<h2>DisplayElements</h2>

@{ 
    foreach (var item in Model.dictionaryOfElements)
    {
        <p>
            Atomic Number:
            Symbol:
            Name:
            Weight:
        </p>

    }
}


I want to be able to loop through the dictionary and print all the elements.

    <p>
                Atomic Number:@item.AtomicNumber
                Symbol: @item.Symbol
                Name: @item.Name
                Weight: @item.Weight
    </p>

Следующий цикл не работает для меня.

foreach(KeyValuePair<int, Elements> elementKeyValuePair in ictionaryOfElements)
        {

        }

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

Elements element = dictionaryOfElements[4];

Наконец, я буду добавлять все 118 элементов периодической таблицы.Это лучший подход?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

foreach (KeyValuePair<int, Elements> item in dictionaryOfElements) будет перебирать каждый KeyValuePair в вашем словаре, поэтому в вашем HTML вы можете сделать следующее:

    @foreach(KeyValuePair<int, Elements> item in dictionaryOfElements)
    {
         <p>
            Atomic Number:item.AtomicNumber
            Symbol: item.Symbol
            Name: item.Name
            Weight: item.Weight
         </p>
    }

Для того, чтобы извлечь конкретный элемент на основе ключа, который выможно использовать TryGetValue, который будет пытаться получить значение на основе ключа.Метод вернет истину или ложь в зависимости от того, существует ключ или нет.Нет никаких исключений для обработки, если ваш ключ не равен нулю.

С учетом сказанного в вашем HTML вы можете сделать следующее:

    @{
        Elements item = new Elements();
        if (dictionaryOfElements.TryGetValue(4, out item))
        {
            <p>
                item.AtomicNumber
                item.Symbol
                item.Name
                item.Weight
            </p>
        }
    };

Примечание вам может понадобитьсяукажите @using Elements в начале вашего HTML.

Наконец, чтобы ответить на ваш вопрос, да, это кажется хорошим подходом.Единственное предложение, которое я хотел бы сделать, - это создать класс ViewModel ElementViewModel с той же структурой, что и ваши элементы модели.

ViewModel будет использоваться для передачи данных с вашего контроллера на ваше представление.В двух словах, модель определяет вашу структуру данных, если хотите - она ​​отражает вашу базу данных или то, как ваши данные представлены.

С другой стороны, viewModel - это структура данных, которую вы передадите в View.

В вашем примере - возможно, - в этом нет никакого преимущества, но я чувствую, что изучениеправильная структура поможет вам в обучении C Sharp.

0 голосов
/ 08 февраля 2019

Сначала вы должны вернуть объект ElementsOfPeriodicTable из контроллера:

 public ActionResult DisplayElements()
{          
    dictionaryOfElements.Add(Hydrogen.AtomicNumber, Hydrogen);
    dictionaryOfElements.Add(Helium.AtomicNumber, Helium);
    dictionaryOfElements.Add(Lithium.AtomicNumber, Lithium);
    dictionaryOfElements.Add(Beryllium.AtomicNumber, Beryllium);

    return View(new ElementsOfPeriodicTable{
                                          dictionaryOfElements=dictionaryOfElements
                                           }
             );
}

Если вы сделаете это, я думаю, что цикл foreach будет работать:

foreach(KeyValuePair<int, Elements> elementKeyValuePair in ictionaryOfElements)
        {

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