2016-09-27 2 views
1

Jedes Mal, wenn ich versuche, einen Datensatz zu bearbeiten, den ich in meinem ASP.NET MVC-Projekt erstellt habe, werden die Felder beim Klicken auf Speichern ungültig gemacht.Feld in der Datenbanktabelle wird ungültig, wenn Datensatz in Ansicht bearbeitet wird

Hier ist ein Teil des Codes für meine bearbeiten Get und Post in meinem Controller:

Bewertung Controller:

// GET: Reviews/Edit/5 
    public ActionResult Edit(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     Review review = db.Reviews.Find(id); 
     if (review == null) 
     { 
      return HttpNotFound(); 
     } 
    ViewBag.ReviewID = new SelectList(db.Reviews, "ReviewID", "Rating", review.ReviewID); 
    return View(review); 
} 


// POST: Reviews/Edit/5 
// To protect from overposting attacks, please enable the specific properties you want to bind to, for 
// more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit([Bind(Include = "ReviewID,Username,WellnessService,Rating,Feedback,Date")] Review review) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Entry(review).State = EntityState.Modified; 
     db.SaveChanges(); 
     return RedirectToAction("ReviewEdit"); 
    } 
    ViewBag.ReviewID = new SelectList(db.Reviews, "ReviewID", "Rating", review.ReviewID); 
    return View(review); 
} 

Hier ist der Code für meine Ansicht namens Edit:

@using (Html.BeginForm()) 
     { 
       @Html.AntiForgeryToken() 
      <div class="form-horizontal"> 
       <h4>@Html.DisplayFor(model => model.WellnessService)</h4> 
       <hr /> 
       @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
       @Html.HiddenFor(model => model.ReviewID) 


       <div class="form-group"> 
        @Html.LabelFor(model => model.Rating, htmlAttributes: new { @class = "control-label col-md-2" }) 
        <div class="col-md-10" align="left"> 
         @{ 
          List<SelectListItem> listItems = new List<SelectListItem>(); 
          listItems.Add(new SelectListItem { Text = "1", Value = "1" }); 
          listItems.Add(new SelectListItem { Text = "2", Value = "2" }); 
          listItems.Add(new SelectListItem { Text = "3", Value = "3" }); 
          listItems.Add(new SelectListItem { Text = "4", Value = "4" }); 
          listItems.Add(new SelectListItem { Text = "5", Value = "5" }); 
          listItems.Add(new SelectListItem { Text = "6", Value = "6" }); 
          listItems.Add(new SelectListItem { Text = "7", Value = "7" }); 
         } 

         @Html.DropDownListFor(model => model.Rating, listItems, "Please choose value") 
         @Html.ValidationMessageFor(model => model.Rating, "", new { @class = "text-danger" }) 
        </div> 
       </div> 

       <div class="form-group"> 
        @Html.LabelFor(model => model.Feedback, htmlAttributes: new { @class = "control-label col-md-2" }) 
        <div class="col-md-10"> 
         @Html.TextAreaFor(model => model.Feedback, new { htmlAttributes = new { @class = "form-control" } }) 
         @Html.ValidationMessageFor(model => model.Feedback, "", new { @class = "text-danger" }) 
        </div> 
       </div> 

       <div class="form-group"> 
        <div class="col-md-offset-2 col-md-10"> 
         <input type="submit" value="Save" class="btn btn-default" /> 
        </div> 
       </div> 
      </div> 
          } 

     <div> 
      @Html.ActionLink("Back to My Reviews", "ReviewEdit", new { @class = "btn btn-success btn-lg" }) 
     </div> 

     @section Scripts { 
      @Scripts.Render("~/bundles/jqueryval") 
     } 

Hilfe würde sehr geschätzt

Vielen Dank im Voraus

+0

Können Sie einen Breakpoint in der Controller-Methode nach 'Edit()' setzen und sehen, was der Inhalt von 'Review' ist? Ist es auch null? –

Antwort

1

Haben Sie keinen Entwickler-PC zur Hand, um dies zu überprüfen, aber sind Sie sicher, dass die Überprüfung Daten enthält. Wenn dies der Fall ist, können Sie sicher sein, dass die folgende Zeile funktioniert?

db.Entry(review).State = EntityState.Modified; 

Müssen Sie keine Überprüfung an den Kontext anhängen?

Was passiert, wenn Sie vorübergehend etwas tun;

if (ModelState.IsValid) 
{ 
    var foo = db.Entry.Where(x=>x.reviewId == review.reviewId).First(); 
    // then manually set all the parameters 

    db.SaveChanges(); 
    return RedirectToAction("ReviewEdit"); 
} 

Es ist nicht elegant, aber wenn das funktioniert, und Ihre Daten aktualisiert wird, zumindest wissen Sie seine, wie Sie das Objekt in den Kontext zu befestigen. Ich werde später versuchen, ein besseres Beispiel zu bekommen, wenn ich zu einer Dev-Workstation komme.

Verwandte Themen