0

Im trying to get the value based on key from a dictionary with the following statement:

It just throws NULL reference exception, but I do have a Key value pair with the key "MyKey"

@Model.DictionaryTest["MyKey"]

Should I be using a List of Dictionaries? If so can you give me the statement to retrieve from that?

UPDATE-- This is the class I'm passing as Model and in the controller I'm populating the dictionary.(I've checked the values are intact)

public class Dummy_PreHires_View_Model
{
    public Dictionary<string, string> DictionaryTest { get; set; }
}

This is one of the data on the dictionary, if this helps, i've tried with the key mentioned on the picture, still throws NULL exception: Dictionary data snap

MY Controller Code:

public ActionResult PreHires_Dummy()
        {
            ViewBag.PreHires_Dummy_class = "active";

            Dummy_PreHires_View_Model dpvm = new Dummy_PreHires_View_Model();
            Dummy_PreHires_Translate_Model dptm = new Dummy_PreHires_Translate_Model();

            dpvm.DictionaryTest = dptm.GetTranslatedData();

            return View(dpvm);
        }
Siddharth Dinesh
  • 345
  • 4
  • 13
  • Possible duplicate of [What is a NullReferenceException, and how do I fix it?](https://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) – SᴇM Apr 19 '19 at 06:59
  • Check your `@Model`. – SᴇM Apr 19 '19 at 07:00
  • Why would you use list of dictionaries,? it seems there is no need in your case. See 1) if you are returning Model from the view correctly 2) your view is binded with the correct model 3) your model contains dictionary with elements. – Sana.91 Apr 19 '19 at 07:08

1 Answers1

1

I wrote a sample here. I hope it will help you.

Model:

using System;
using System.ComponentModel.DataAnnotations;
using System.Collections.Generic;

namespace HelloWorldMvcApp {
    public class SampleViewModel {
        [Required]
        [MinLength(10)]
        [MaxLength(100)]
        [Display(Name = "Ask Magic 8 Ball any question:")]
        public string Question { get; set; }

        //See here for list of answers
        public string Answer { get; set; }

        public Dictionary<string, string> DictionaryTest { get; set; }
    }
}

Controller:

using System;
using System.Web.Mvc;
using System.Collections.Generic;

namespace HelloWorldMvcApp {
    public class HomeController : Controller {
        [HttpGet]
        public ActionResult Index() {
            SampleViewModel viewModel = new SampleViewModel();
            viewModel.DictionaryTest = new Dictionary<string, string>();
            viewModel.DictionaryTest.Add("key1", "value1");
            viewModel.DictionaryTest.Add("key2", "value2");
            return View(viewModel);
        }

        [HttpPost]
        public JsonResult GetAnswer(string question) {              
            int index = _rnd.Next(_db.Count);
            var answer = _db[index];
            return Json(answer);
        }

        private static Random _rnd = new Random();

        private static List<string> _db = new List<string> { "Yes", "No", "Definitely, yes", "I don't know", "Looks like, yes"} ;
    }
}

View:

@model HelloWorldMvcApp.SampleViewModel
@{
    Layout = null;
}

<!DOCTYPE html>
<!-- template from http://getbootstrap.com/getting-started -->

<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Bootstrap 101 Template</title>

        <!-- CSS Includes -->
        <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">

        <style type="text/css">

            .field-validation-error {
                color: #ff0000;
            }

        </style>
    </head>

    <body>
        <div class="container">
            <div class="col-md-6 col-md-offset-3">
                <h1>Hello Stranger</h1>

                @using (Html.BeginForm())
                {
                    <div class="form-group">
                        @Html.LabelFor(m => m.Question)
                        @Html.TextBoxFor(model => model.Question, new {@class="form-control"}) 
                        @Html.ValidationMessageFor(model => model.Question)
                        @Model.DictionaryTest["key1"]
                        @Model.DictionaryTest["key2"]
                    </div>

                    <button type="button" class="btn btn-success submit">Ask</button>
                }

                <br/><br/>
                <div class="alert alert-warning fade">
                    <img src="http://entechprod.blob.core.windows.net/dotnetfiddle/morpheus.jpg" style="max-width:100%;"/><br/><br/>
                    <strong><span class="alert-content"></span></strong>
                </div>
            </div>
        </div>

        <!-- JS includes -->
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
        <script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>

        <script src="//ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js"></script>
        <script src="//ajax.aspnetcdn.com/ajax/mvc/4.0/jquery.validate.unobtrusive.min.js"></script>

        <script type="text/javascript">

            function openAlert(txt) {
                $('.alert-content').text(txt);
                $('.alert').addClass('in');
            }

            function closeAlert() {
                $('.alert').removeClass('in');
            }

            $(function(){
                var answer = '@Model.Answer';

                if(answer && answer != '') 
                    openAlert(answer);

                $('#Question').change(closeAlert);
                $('#Question').keyup(closeAlert);

                $('.submit').click(function(){
                    if($('form').valid()) {

                        $.ajax({
                            url: '@Url.RouteUrl(new{ action="GetAnswer", controller="Home"})',
                            data: {Answer: '', Question: $('#Question').val()},
                                type: 'POST',
                                dataType: 'json',
                                contentType: "application/json; charset=utf-8",
                                success: function(resp) {
                                openAlert(resp);
                        }});
                    }
                    else {
                        closeAlert();
                    }
                });

            });

        </script>
    </body>
</html>
karel
  • 5,489
  • 46
  • 45
  • 50
J. Hsu
  • 67
  • 4
  • 1
    Hi, thank you for your input, I can see that the flow of my dictionary data is more or less similar to yours. the only difference is that Im converting the value from a DataTable and putting it into the dictionary. I've added a little more detail in my question. – Siddharth Dinesh Apr 19 '19 at 08:51