DropDownListFor i rzucany wyjątek NullReferenceException

0

Witam,
mam problem z DropDownListFor, wyrzucami mi wyjątek NullReferenceException, próbowałem różnych kombinacji kodu znalieżionych w sieci, ale zawsze jest to samo.

Models:

 public class Category
    {
        [Key]
        [ScaffoldColumn(false)]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int CategoryId { get; set; }

        [Required]
        [Display(Name = "Nazwa kategorii: ")]
        public string Name { get; set; }

        public virtual List<Word> Words { get; set; }

        [ScaffoldColumn(false)]
        public string UserEmail { get; set; }
        public virtual User User { get; set; }
    }

public class User
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [ScaffoldColumn(false)]
        public int UserId { get; set; }

        [Key]
        [Required]
        [EmailAddress]
        [StringLength(100)]
        [Display(Name = "Adres Email: ")]
        public string Email { get; set; }

        [Required]
        [Display(Name = "Hasło: ")]
        public string EncryptedPassword { get; set; }

        [ScaffoldColumn(false)]
        public string PasswordSalt { get; set; }

        [NotMapped]
        public string Password { get; set; }

        public virtual List<Word> Words { get; set; }
        public virtual List<Category> Categorys { get; set; }

    }

 public class Word
    {
        [Key]
        [ScaffoldColumn(false)]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int WordId { get; set; }

        [Required]
        [Display(Name = "Polskie słowo: ")]
        public string PolishWord { get; set; }

        [Required]
        [Display(Name = "Angielskie słowo: ")]
        public string EnglishWord { get; set; }

        [Required]
        public string Status { get; set; }

        [ScaffoldColumn(false)]
        public string UserEmail { get; set; }
        public virtual User User { get; set; }

        public int CategoryId { get; set; }
        public virtual Category Category { get; set; }
    }

public class WordCategory
    {
        public List<Category> category { get; set; }
        public Word word { get; set; }
    }

Controller:


public ActionResult CreateWord()
        {
            using (var db = new UserContext())
            {
                WordCategory wordCategory = new WordCategory();
                var categorys = db.Categorys.Where(c => c.UserEmail == UserController.ActualyLoggedUser.Email).ToList();
                var newWord = new Word();
                wordCategory.category = categorys;
                wordCategory.word = newWord;
                return View(wordCategory);
            }
        }

View:


<div class="form-group">
            @Html.LabelFor(model => model.word.Category, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownListFor(model=>model.word.CategoryId, new SelectList(Model.category, "CategoryId", "Name")) //w tej linijce wyrzuca wyjątek
                @Html.ValidationMessageFor(model => model.word.Category.Name)
            </div>
        </div>
0

Spróbuj tak:

@Html.DropDownListFor(model=>model.word.CategoryId, Model.category))
0

Problem chyba jest w tej pierwszej części czyli w model => model.word.CategoryId, bo lista się wyświetla poprawnie. Zmieniłem klucz obcy w word z CategoryId na CategoryName i zapis z model => model.word.CategoryId na model => model.word.CategoryName, bo gdzieś mi sie rzuciło w oczy że lista zwraca stringa po wybraniu opcji, ale tez nie działa.

0
  1. Czy w tej linijce

    return View(wordCategory);

    jak ustawisz breakpoint to wordCategory zawiera tą listę?

  2. Jaki jest model widoku?

  3. Spróbuj w kontrolerze utworzyć listę i przesłać ją VewBagiem - zobacz czy to Ci zadziała.
    Dodaj ten kod do kontrolera przed "return...":

    ViewBag.categorys = categorys.Select(x=> new SelectListItem{Text=x.Name, Value=x.Id.ToString()}).ToList();

    a tak do widoku zrób ten dropDown:

     @Html.DropDownListFor(model=>model.word.CategoryId, (IEnumerable<SelectList>)ViewBag.categorys) // tu nie jestem pewien czy ma być SelectList czy SelectListItem - spróbuj oba 
0

Tak, jest lista. Model widoku to oczywiscie WordCategory

0

Teraz jest nieco inny problem: There is no ViewData item of type 'IEnumerable<selectlistitem>' that has the key 'CategoryId' (w tej samej linijce co wcześniej)

Aktualnie kod wygląda tak:

public ActionResult CreateWord()
        {
            using (var db = new UserContext())
            {
                var userCategory = db.Categorys.Where(c => c.UserEmail == UserController.ActualyLoggedUser.Email).ToList();
                ViewBag.userCategory = userCategory.Select(x => new SelectListItem { Text = x.Name, Value = x.CategoryId.ToString() }).ToList();

                return View();
            }
        }

@model MasterOfEnglish.Models.Word
@Html.DropDownListFor(model => model.CategoryId, (IEnumerable<SelectListItem>)ViewBag.userCategory)
0

Przykładowy obiekt z którego zrobię sobie listę do DropDown-a:

   public class Person
    {
         public string Name { get; set; }
         public int Id { get; set; }
    }

Przykładowy model do zapisania wybranej pozycji w dropDown:

public class MojModel
    {
        public int Id { get; set; }
    }

Akcja kontrolera:
Nie sugeruj się że wybrany mam "Partial1" - nie chciało mi się kasować widoku Contact po prostu :P

   public ActionResult Contact()
        {
            var k = new List<Person> {new Person {Name = "1", Id = 1}, new Person {Name = "2", Id = 2}, new Person {Name = "3", Id = 3}};

            ViewBag.list = k.Select(x => new SelectListItem {Text = x.Name, Value = x.Id.ToString()});

            return View("Partial1");
        }

Kod w widoku:

@model WebApplication3.Controllers.MojModel

@Html.DropDownListFor(model => model.Id, (IEnumerable<SelectListItem>)ViewBag.list)

W załączniku screen ;)

0

Przeczytałem Twój kod jeszcze raz!
w tej części:

ViewBag.userCategory = userCategory.Select(x => new SelectListItem { Text = x.Name, Value = x.CategoryId.ToString() }).ToList();

usuń to "ToList();"

0

Moj kod jest zrobiony dokładnie wg schematu, który podałeś, bez ToList() też próbowałem, ale cały czas jest to samo. Wiele rozwiązań już próbowałem znaleźionych w sieci niestety nic nie działa.

0

Są, bo lista rozwijana normalnie się tworzy, dopiero jak naciskam w przycisk zatwierdzający wpisane dane w przeglądarce, wyskakuje ten błąd. Po prostu nie może zapisac wybranego z listy elementu do model.CategoryId bo mu sie typ nie zgadza tylko nie rozumiem dlaczego

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0