0
votes

I cant figure out why i get the error : MVC: The model item passed into the dictionary is of type X, but this dictionary requires a model item of type Degreenery.models.Gebruiker. Im not at home right now so i dont have the full error but have someone any idea why i get this kind of error when the modelstate is valid en i dont get any return of the Datareader1. Is he passed of of that he must go to the else where he stores the Gebruiker model from the view.

I know there are more quistions on stack but they are different in my opinion.

Code model:

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


namespace DeGeenery.Models 
{ 
   public class Gebruiker 
    { 


     public string test { get; set; } 


    public int is_beheerder { get; set; } 


     public int is_manager { get; set; } 


     public bool ingelogd { get; set; } 


     public int gebruiker_id { get; set; } 


     [Required(ErrorMessage = "Dit veld is verplicht")] 
     public string voornaam { get; set; } 


    [Required(ErrorMessage = "Dit veld is verplicht")] 
     public string achternaam { get; set; } 


     [Required(ErrorMessage = "Dit veld is verplicht")] 
     public string adres { get; set; } 

      [Required(ErrorMessage = "Dit veld is verplicht")] 
     public int huisnummer { get; set; } 


     [Required(ErrorMessage = "Dit veld is verplicht")] 
     public string postcode { get; set; } 


     [Required(ErrorMessage = "Dit veld is verplicht")] 
     public string woonplaats { get; set; } 


     [Required(ErrorMessage = "Dit veld is verplicht")] 
     public string email { get; set; } 


     [Required(ErrorMessage = "Dit veld is verplicht")] 
     public string wachtwoord { get; set; } 


     public override string ToString() 
     { 
         return voornaam + " " + achternaam; 
     } 




  } 
} 

Code Controller:

  using MySql.Data.MySqlClient;
  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Web;
  using System.Web.Mvc;
  using DeGeenery.Models;

  namespace DeGeenery.Controllers
{
public class RegisterController : DatabaseController
{

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

    [HttpPost]
    public ActionResult Registreren(Gebruiker nieuw) //Gebruiker model ingevoerd door de gebruiker
    {

        try
        {
            MySqlTransaction trans = null;


            if (ModelState.IsValid)
            {
                connection.Open();
                string selectQuery = "SELECT email from gebruiker where email = @emailadres";
                MySqlCommand sql = new MySqlCommand(selectQuery, connection);
                MySqlParameter emailParam = new MySqlParameter("@emailadres", MySqlDbType.VarChar);
                sql.Parameters.Add(emailParam);
                emailParam.Value = nieuw.email;

                MySqlDataReader dataReader1 = sql.ExecuteReader();

                if (dataReader1.Read())
                {

                    string emailexist = dataReader1.GetString("email");
                    ViewBag.throwerror = "Gebruiker " + emailexist + " bestaat al";
                    return View("Index", nieuw);

                }
                else
                {
                    trans = connection.BeginTransaction();
                    string insertQuery = "INSERT INTO gebruiker (voornaam,  achternaam, adres, huisnummer, postcode, woonplaats, email, wachtwoord) VALUES (@voornaam, @achternaam, @adres, @huisnummer,"
                + "@postcode, @woonplaats, @email, @wachtwoord)";
                    MySqlCommand cmd = new MySqlCommand(insertQuery, connection);
                    MySqlParameter gebruiker_voornaam = new MySqlParameter("@voornaam", MySqlDbType.VarChar);
                    MySqlParameter gebruiker_achternaam = new MySqlParameter("@achternaam", MySqlDbType.VarChar);
                    MySqlParameter gebruiker_adres = new MySqlParameter("@adres", MySqlDbType.VarChar);
                    MySqlParameter gebruiker_huisnummer = new MySqlParameter("@huisnummer", MySqlDbType.Int32);
                    MySqlParameter gebruiker_postcode = new MySqlParameter("@postcode", MySqlDbType.VarChar);
                    MySqlParameter gebruiker_woonplaats = new MySqlParameter("@woonplaats", MySqlDbType.VarChar);
                    MySqlParameter gebruiker_email = new MySqlParameter("@email", MySqlDbType.VarChar);
                    MySqlParameter gebruiker_wachtwoord = new MySqlParameter("@wachtwoord", MySqlDbType.VarChar);
                    cmd.Parameters.Add(gebruiker_voornaam);
                    cmd.Parameters.Add(gebruiker_achternaam);
                    cmd.Parameters.Add(gebruiker_adres);
                    cmd.Parameters.Add(gebruiker_huisnummer);
                    cmd.Parameters.Add(gebruiker_postcode);
                    cmd.Parameters.Add(gebruiker_woonplaats);
                    cmd.Parameters.Add(gebruiker_email);
                    cmd.Parameters.Add(gebruiker_wachtwoord);

                    //Gebruiker model vullen
                    gebruiker_voornaam.Value = nieuw.voornaam;
                    gebruiker_achternaam.Value = nieuw.achternaam;
                    gebruiker_adres.Value = nieuw.adres;
                    gebruiker_huisnummer.Value = nieuw.huisnummer;
                    gebruiker_postcode.Value = nieuw.postcode;
                    gebruiker_woonplaats.Value = nieuw.woonplaats;
                    gebruiker_email.Value = nieuw.email;
                    gebruiker_wachtwoord.Value = nieuw.wachtwoord;

                    cmd.Prepare();
                    cmd.ExecuteNonQuery();
                    trans.Commit();
                    Session["Klant"] = nieuw;
                    return View("RegistratieVoltooid");
                }


            }

            else
            {

                return View("Index", nieuw);

            }

        }
        catch (Exception e)
        {

            return View("Index", e);

        }

     }
   }
}

Code view:

  @model DeGeenery.Models.Gebruiker

@{
ViewBag.Title = "Registreren";
}

 <h1> Registeren</h1>
 <hr>
        Middels onderstaand formulier kunt u zich registeren voor een   account, zodat u bij ons uw bestellingen bij kunt houden en oude bestellingen kunt herhalen.<br><br>

 <div class="form">

<label for="voornaam">Voornaam:</label><br>
<label for="achternaam">Achternaam:</label><br>
<label for="straat">Adres:</label><br>
<label for="straat">Huisnummer:</label><br>
<label for="postcode">Postcode:</label><br>
<label for="woonplaats">Woonplaats:</label><br>
<label for="email">Email:</label><br>
<label for="wachtwoord">Wachtwoord:</label><br>
</div>


 @*<form name="input" method="post" action="/Register/Registreren">
    <input type="text" name="voornaam"><br>
    <input type="text" name="achternaam"><br>
    <input type="text" name="adres"><br>
    <input type="text" name="huisnummer"><br>
    <input type="text" name="postcode"><br>
    <input type="text" name="woonplaats"><br>
    <input type="text" name="email"><br>
    <input type="password" name="wachtwoord"><br>
    <input type="submit" value="Registreer"><br>
</form>*@

 <div class="form">
 <form name="input" method="post" action="/Register/Registreren">

    @Html.TextBoxFor(model => model.voornaam)
    @Html.ValidationMessageFor(model => model.voornaam)
    <br />
    @Html.TextBoxFor(model => model.achternaam)
    @Html.ValidationMessageFor(model => model.achternaam)
    <br />
    @Html.TextBoxFor(model => model.adres)
    @Html.ValidationMessageFor(model => model.adres)
    <br />
    @Html.TextBoxFor(model => model.huisnummer)
    @Html.ValidationMessageFor(model => model.huisnummer)
    <br />
    @Html.TextBoxFor(model => model.postcode)
    @Html.ValidationMessageFor(model => model.postcode)
    <br />
    @Html.TextBoxFor(model => model.woonplaats)
    @Html.ValidationMessageFor(model => model.woonplaats)
    <br />
    @Html.TextBoxFor(model => model.email)
    @Html.ValidationMessageFor(model => model.email) @ViewBag.throwerror
    <br />
    @Html.TextBoxFor(model => model.wachtwoord)
    @Html.ValidationMessageFor(model => model.wachtwoord)
    <br />

    <input type="submit" value="Registreer"><br>

   </form>
   </div>
3
I think you need to pass the model to return View("RegistratieVoltooid",YourModel);ManojAnavatti
Maybe an exception is catched and passed as (the wrong) ViewModel in return View("Index", e);Georg Patscheider
@GeorgPatscheider hmm i don't understand what you mean. How should i do it then?Tony
By the way, since nobody seems to be telling you this, you should absolutely move all that MySQL related code into a separate class. Your controllers should be relatively small while the actual work should happen in separate services. Trust me, if you want this to be maintainable or if you ever want to introduce unit testing (which I'm 100% sure you're not doing right now) you should look into splitting that code up.Moeri
Oke thank you for the advice @MoeriTony

3 Answers

1
votes

This line:

return View("Index", e);

does not match with the @model in your View:

@model DeGeenery.Models.Gebruiker

because e is an Exception object, and not a Gebruiker object.

You probably should create a view Error.cshtml (good place is in folder Shared), with this as the first line:

@model System.Exception

and then use this:

return View("Error", e);
0
votes

The model item passed into the dictionary is of type 'MySql.Data.MySqlClient.MySqlException', but this dictionary requires a model item of type 'DeGeenery.Models.Error'.

Beschrijving: Er is een onverwerkte uitzondering opgetreden tijdens het uitvoeren van de huidige webaanvraag. Raadpleeg de stacktracering voor meer informatie over deze fout en de oorsprong ervan in de code.

Details van uitzondering: System.InvalidOperationException: The model item passed into the dictionary is of type 'MySql.Data.MySqlClient.MySqlException', but this dictionary requires a model item of type 'DeGeenery.Models.Error'.

0
votes

No need to worry just follow simple step and you will get answer your Linein view is : @model DeGeenery.Models.Gebruiker

just remove that .Models Means Just keep : @model DeGeenery.Gebruiker or if you have WMS project just add @model WMS.Class_Name it will : WMS.Gebruiker