如何将字典值从Controller传递到View?

时间:2019-02-08 04:18:09

标签: c# asp.net-mvc dictionary

我正在创建一个元素周期表,并且已经在Home Controller中创建了一个字典,名为dictionaryOfElements,该字典具有元素的原子序数作为键和元素的原子序数,符号,名称和权重作为值。在从ViewModel到View的视图中显示字典的所有值时,我需要帮助。

下面是我创建的模型:

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;
    }
}

我在其中声明字典的Home Controller

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 :(得分:0)

首先,您应该从控制器返回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)
        {

        }

答案 1 :(得分:0)

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>
    }

为了检索特定项目,您可以使用键GetGetValue,它会尝试根据键检索值。根据密钥是否存在,该方法将返回true或false。除非您的密钥为空,否则没有例外。

在HTML中说了这一点,您可以执行以下操作:

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

注意,您可能需要在HTML的开头指定@using元素。

最后回答您一个问题,是的,这似乎是个好方法。我唯一的建议是创建一个与Model Elements具有相同结构的ViewModel类ElementViewModel。

ViewModel将用于将数据从控制器传递到视图。简而言之,模型可以定义您的数据结构,如果可以的话-它可以反映数据库或数据的表示方式。

另一方面,viewModel是您将传递给View的数据结构。

在您的示例中-也许-这样做没有优势,但是我认为学习正确的结构将有助于您学习C Sharp。