【问题标题】:MVC: The model item passed into the dictionary is of type X, but this dictionary requires a model item of type Degreenery.models.GebruikerMVC:传入字典的模型项是 X 类型的,但是这个字典需要 Degreenery.models.Gebruiker 类型的模型项
【发布时间】:2016-03-18 08:50:38
【问题描述】:

我不知道为什么会出现错误:MVC:传递到字典中的模型项是 X 类型,但是该字典需要 Degreenery.models.Gebruiker 类型的模型项。我现在不在家,所以我没有完整的错误,但有人知道为什么当模型状态有效时我会得到这种错误,我没有得到 Datareader1 的任何返回。他是否通过了,他必须从视图中去存储 Gebruiker 模型的其他地方。

我知道堆栈上有更多的问题,但在我看来它们是不同的。

代码模型:

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




  } 
} 

代码控制器:

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

        }

     }
   }
}

代码查看:

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

【问题讨论】:

  • 我认为你需要通过模型返回View("RegistratieVoltooid",YourModel);
  • 可能在return View("Index", e);中捕获了异常并作为(错误的)ViewModel 传递
  • @GeorgPatscheider 嗯,我不明白你的意思。那我该怎么做呢?
  • 顺便说一句,由于似乎没有人告诉你这一点,你绝对应该将所有与 MySQL 相关的代码移到一个单独的类中。您的控制器应该相对较小,而实际工作应该发生在单独的服务中。相信我,如果您希望它是可维护的,或者如果您想要引入单元测试(我 100% 确定您现在没有这样做),您应该考虑拆分该代码。
  • 好的,谢谢@Moeri 的建议

标签: c# asp.net-mvc dictionary


【解决方案1】:

这一行:

return View("Index", e);

与您视图中的@model 不匹配:

@model DeGeenery.Models.Gebruiker

因为e 是一个 Exception 对象,而不是 Gebruiker 对象。

你可能应该创建一个视图Error.cshtml(好地方是在Shared文件夹中),第一行是这个:

@model System.Exception

然后使用这个:

return View("Error", e);

【讨论】:

    【解决方案2】:

    传入字典的模型项是“MySql.Data.MySqlClient.MySqlException”类型的,但该字典需要一个“DeGeenery.Models.Error”类型的模型项。

    Beschrijving: E​​r 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: 传入字典的模型项的类型为“MySql.Data.MySqlClient.MySqlException”,但此字典需要“DeGeenery.Models.Error”类型的模型项。

    【讨论】:

      【解决方案3】:

      不用担心,只需按照简单的步骤,你就会得到答案 你的 Linein 视图是:@model DeGeenery.Models.Gebruiker

      只需删除 .Models 方法 请保留:@model DeGeenery.Gebruiker 或者如果您有 WMS 项目,只需添加 @model WMS.Class_Name 即可:WMS.Gebruiker

      【讨论】:

      • 你的回答不是很清楚。由于我很难理解,请重新阅读并进行必要的修改。请在发布前阅读 SO 指南。
      猜你喜欢
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      • 2015-07-05
      相关资源
      最近更新 更多