ASP.NET MVC 4 ist ModelState.IsValid immer falsch
Problem: ich folgte dem tutorial hier und ich ziehen kann Daten aus der Datenbank. Ich kann auch Löschen von Datensätzen aus der Datenbank. Aber wenn ich versuche zu erstellen oder zu Bearbeiten, bekomme ich diesen Fehler:
So, wie ich war auf der Suche in den controller und ich sehe, dass es ModelState.IsValid ist, wenn ich einen Haltepunkt setzen, um es, es ist immer falsch.
Hier ist mein Modell:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Linq;
using System.Web;
namespace MvcApplication1.Models
{
public class Text
{
[Key]
public int id { get; set; }
[Required]
public string text { get; set; }
}
public class textDBContext : DbContext
{
public DbSet<Text> texts { get; set; }
}
}
Meiner Datenbank zwei Felder: "id" und "text". "id" ist vom Datentyp int
und "text" ist vom Datentyp string.
Generiert ich diesen controller aus dem Modell erzeugten auch die Ansichten (CRUD)
Hier ist mein controller:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcApplication1.Models;
namespace MvcApplication1.Controllers
{
public class textDBController : Controller
{
private textDBContext db = new textDBContext();
//
//GET: /textDB/
public ActionResult Index()
{
return View(db.texts.ToList());
}
//
//GET: /textDB/Details/5
public ActionResult Details(int id = 0)
{
Text text = db.texts.Find(id);
if (text == null)
{
return HttpNotFound();
}
return View(text);
}
//
//GET: /textDB/Create
public ActionResult Create()
{
return View();
}
//
//POST: /textDB/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Text text)
{
if (ModelState.IsValid)
{
db.texts.Add(text);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(text);
}
//
//GET: /textDB/Edit/5
public ActionResult Edit(int id = 0)
{
Text text = db.texts.Find(id);
if (text == null)
{
return HttpNotFound();
}
return View(text);
}
//
//POST: /textDB/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Text text)
{
if (!ModelState.IsValid)
{
var errors = ModelState.Values.SelectMany(v => v.Errors);
//Breakpoint, Log or examine the list with Exceptions.
}
if (ModelState.IsValid)
{
db.Entry(text).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(text);
}
//
//GET: /textDB/Delete/5
public ActionResult Delete(int id = 0)
{
Text text = db.texts.Find(id);
if (text == null)
{
return HttpNotFound();
}
return View(text);
}
//
//POST: /textDB/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
Text text = db.texts.Find(id);
db.texts.Remove(text);
db.SaveChanges();
return RedirectToAction("Index");
}
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
}
}
Hier ist der Bearbeiten-Ansicht:
@model MvcApplication1.Models.Text
@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Text</legend>
@Html.HiddenFor(model => model.id)
<div class="editor-label">
@Html.LabelFor(model => model.text)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.text)
@Html.ValidationMessageFor(model => model.text)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
Was mache ich hier falsch?
- Haben Sie eine Validierung der Annotationen in
MvcApplication1.Models.Text
? - Entfernen Sie die
[Required]
über Ihren text Eigenschaften und versuchen Sie es erneut. Nur um zu bestätigen, was @jeroenVannevel sagt. Wenn ja, könnten Sie haben eine weitere Validierung der Annotationen. - Durch die Art und Weise, die Sie nicht benötigen Sie den [Key] - Attributs für id entity framework erkennt es durch Konvention, um eine primäre Schlüssel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass der name der Eigenschaft, Klasse name, argument-Namen, die alle das gleiche Durcheinander des MVC-Modells-Bindung Magie. Wenn Sie ändern:
zu:
sendet es wieder richtig.
null
). Also ja, eine Namenskonvention zu verwenden, entgegen, dass dieser 🙂Wenn Klassenname und der name der Eigenschaft wird dasselbe Modell dann verbindlich, nicht mapping perperly.
[HttpPost]
public ActionResult TextView(Text objtext,string text)
{ return View(); }
Hier können Sie überprüfen, objText erhalten Sie die Daten , und text auch erhalten die Daten aus der textbox.
Hoffe, es wird für Sie arbeiten.
Das könnte das problem lösen:-
code diese im unteren Bereich der Ansicht