2017-03-01 4 views
0

Ich versuche, ein Element über die Bearbeitungsansicht zu bearbeiten. Während des Debugging habe ich festgestellt, dass das Objekt, mit dem ich die Datenbank zu aktualisieren versuche, Felder null oder null hat. Die Bearbeitungsansicht scheint die eingegebenen Daten nicht zurückzugeben. Modell:Bearbeitungsansicht, die Daten nicht korrekt weitergibt

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.Linq; 
using System.Threading.Tasks; 
using Microsoft.Data.Entity; 
using Microsoft.Data.Entity.Infrastructure; 

namespace METALIMPEX.Models 
{ 
    public class Condition 
    { 
     [Key] 
     [Display(Name = "Condition ID")] 
     [Column("condition_id")] 
     [Required] 
     public int conditionID { get; set; } 

     [Display(Name = "Date and time")] 
     [Column("condition_date")] 
     [Timestamp] 
     [Required] 
     public DateTime dateTime { get; set; } 

     [Display(Name = "Component ID")] 
     [Column("component")] 
     [Required] 
     public int componentID { get; set; } 

     [Display(Name = "Operator ID")] 
     [Column("operator")] 
     [Required] 
     public int operatorID { get; set; } 


     [Display(Name = "Component status")] 
     [Column("condition")] 
     [Required] 
     public bool condition { get; set; } 

     [Display(Name = "Comments")] 
     [Column("remarks")] 
     [Required] 
     public string comments { get; set; } 
    } 
    public class ConditionDBContext : DbContext 
    { 
     public DbSet<Condition> Conditions { get; set; } 
     protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
     { 
      optionsBuilder.UseSqlServer("Data Source=DELL-XPS\\SQLEXPRESS;Initial Catalog=METALIMPEX;Integrated Security=True"); 
     } 
    } 
} 

Controller:

using System.Linq; 
using Microsoft.AspNet.Mvc; 
using Microsoft.AspNet.Mvc.Rendering; 
using Microsoft.Data.Entity; 
using METALIMPEX.Models; 
using System.Data.SqlClient; 
using System.Collections.Generic; 
using System.Web; 
using System; 

namespace METALIMPEX.Controllers 
{ 
    public class ConditionController : Controller 
    { 
     private ApplicationDbContext _context; 
     private ConditionDBContext db = new ConditionDBContext(); 
     IList<Condition> conditionList = new List<Condition>(); 

     public ConditionController(ApplicationDbContext context) 
     { 
      _context = context; 
      //DEPRECATED CODE, MANUAL QUERY, PROJECT NOW USES DBCONTEXT 
      /*string strConnection = "Data Source=DELL-XPS\\SQLEXPRESS;Initial Catalog=METALIMPEX;Integrated Security=True"; 
      string sqlQuery = "SELECT REPLICATE('0',6-LEN(RTRIM(PartID))) + RTRIM(PartID) AS 'Part ID', REPLICATE('0', 6 - LEN(RTRIM(OperatorID))) + RTRIM(OperatorID) AS 'Operator ID', Date_Time AS 'Time', IsPartWorking AS 'Part Status', IsMachineWorking AS 'Machine Status' FROM Defect"; 
      SqlConnection sqlConnection = new SqlConnection(strConnection); 
      SqlCommand command = new SqlCommand(sqlQuery, sqlConnection); 
      SqlDataReader Dr; 
      try { 
       sqlConnection.Open(); 
       Dr = command.ExecuteReader(); 
       while (Dr.Read()) 
       { 

        conditionList.Add(new Defect() 
        { 
         conditionID = Dr["Part ID"].ToString(), 
         operatorID = Dr["Operator ID"].ToString(), 
         dateTime = Dr["Time"].ToString(), 
         partStatus = (bool)Dr["Part Status"], 
         machineStatus = (bool)Dr["Machine Status"] 
        }); 
       }; 
       Dr.Dispose(); 
      } 
      catch (SqlException) { 
       throw new InvalidOperationException("An error has occured while connecting to the database"); 
       //OR 
       //return View("Error"); 
      }*/ 
     } 

     // GET: Condition 
     public IActionResult Index() 
     { 
     //return View(conditionList); 
     return View(db.Conditions.ToList()); 
     } 

     // GET: Condition/Details/5 
     public IActionResult Details() 
     { 
      return View(conditionList); 
     } 

     // GET: Condition/Create 
     public IActionResult Create() 
     { 
      return View(); 
     } 

     // POST: Condition/Create 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public IActionResult Create(Condition condition) 
     { 
      if (ModelState.IsValid) 
      { 
       //_context.Condition.Add(condition); 
       //_context.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
      return View(condition); 
     } 

     // GET: Condition/Edit/5 
     public IActionResult Edit(int id) 
     { 
      if (conditionList == null) 
      { 
       return HttpNotFound(); 
      } 
      Condition condition = db.Conditions.Single(m => m.conditionID == id); 
      return View(condition); 
     } 

     // POST: condition/Edit/5 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public IActionResult Edit(Condition condition) 
     { 
      if (ModelState.IsValid) 
      { 
       db.Update(condition); 
       db.Entry(condition).State = EntityState.Modified; 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
      return View(condition); 
     } 

     // GET: condition/Delete/5 
     [ActionName("Delete")] 
     public IActionResult Delete(string id) 
     { 
      return View(conditionList); 
     } 

     // POST: condition/Delete/5 
     [HttpPost, ActionName("Delete")] 
     [ValidateAntiForgeryToken] 
     public IActionResult DeleteConfirmed(string id) 
     { 
      /*Movie movie = db.Movies.Find(id); 
      if (movie == null) 
      { 
       return HttpNotFound(); 
      } 
      db.Movies.Remove(movie); 
      db.SaveChanges(); 
      return RedirectToAction("Index");*/ 
      return RedirectToAction("Index"); 
     } 

    } 
} 

Ausblick:

@model METALIMPEX.Models.Condition 

@{ 
    ViewData["Title"] = "Edit"; 
} 

<h2>Edit</h2> 

<form asp-action="Edit"> 
    <div class="form-horizontal"> 
     <h4>Condition</h4> 
     <hr /> 
     <div asp-validation-summary="ValidationSummary.ModelOnly" class="text-danger"></div> 
     <input type="hidden" asp-for="conditionID" /> 
     <div class="form-group"> 
      <label asp-for="componentID" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="componentID" class="form-control" /> 
       <span asp-validation-for="componentID" class="text-danger" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label asp-for="operatorID" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="operatorID" class="form-control" /> 
       <span asp-validation-for="operatorID" class="text-danger" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <div class="checkbox"> 
        <input asp-for="condition" /> 
        <label asp-for="condition"></label> 
       </div> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label asp-for="dateTime" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="dateTime" class="form-control" /> 
       <span asp-validation-for="dateTime" class="text-danger" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label asp-for="comments" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="comments" class="form-control" /> 
       <span asp-validation-for="comments" 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> 
</form> 

<div> 
    <a asp-action="Index">Back to List</a> 
</div> 

@section Scripts { 
    <script src="~/lib/jquery/dist/jquery.min.js"></script> 
    <script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script> 
    <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script> 
} 

Ich bin ein Anfänger in .NET, so habe ich keine Ahnung, was hier los ist. Die Bearbeitungsansicht wurde vom Framework generiert, daher nehme ich an, dass es funktionieren sollte.

Irgendwelche Ideen?

Antwort

0

Das Problem ist mit dem Parametername der Edit Aktionsmethode. Im Folgenden finden Sie die URL-codierten Formulardaten, die in der Ansicht beim Klicken auf Schaltfläche Speichern unter angezeigt werden.

conditionID = & Datums- und Uhrzeit = 2013.12.01 & ComponentID = 1 & operatorID = 1 & Bedingung = true & Kommentare =

Die Aktion Parametername ist Zustand und es gibt einen Schlüssel -Wertpaar Bedingung = Wahr in den eingehenden Formulardaten. Der Prozess MVC model binding versucht, den Parameter/Eigenschaft (im Fall eines komplexen Modells) dem entsprechenden Route/Query String/Request Body Daten zuzuordnen.

Daher es versucht, den Wert von Zustand in der form-data heißt wahr an den Aktionsparameter zu erfassen und Bool zu Objekt convert versagt schließlich.

Ändern Sie den Parameternamen in einen beliebigen Namen, der keinem Schlüsselnamen in den Formulardaten entspricht, und es sollte funktionieren.

+0

Entfernt alle ** ValidateAntiForgeryToken **, dasselbe Ergebnis. 'return View (condition)' wird ausgeführt und ich bekomme die Bearbeitungsansicht mit 0 oder nichts in allen Feldern, was anzeigt, dass das Bedingungsobjekt aus irgendeinem Grund leere Felder hat. –

+0

Bitte überprüfen Sie meine aktualisierte Antwort –

+0

Hätte nie daran gedacht. Danke vielmals! –

Verwandte Themen