2017-07-11 1 views
0

In meinem SQL gibt es zwei Tabellen, die ich in meinem MVC 4-Projekt bearbeiten möchte. Beide haben Inhalt wie:Wie kann ich mehrere SQL-Tabellen in einer Ansicht in MVC 4 mit Razor-Engine bearbeiten?

id Title Description 
1 title1 desc1 
2 title2 desc2 
. .  . 
. .  . 

Ich habe versucht, sie in einer Ansicht zu erhalten, beide Tabellen in der gleichen Zeit zu bearbeiten. Modell von table1:

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

namespace emirhanozkan.Models 
{ 
public partial class PersonInfo 
{ 
    [Key] 
    public int id { get; set; } 

    public string Title { get; set; } 

    public string Description { get; set; } 
} 
} 

Modell von table2 hat denselben Inhalt nur Klassennamen Profil ist.

Dann stellte sie als Liste in anderer Klasse wie:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using emirhanozkan.Models; 

namespace emirhanozkan.Models 
{ 

    public class AllProfile 
    { 
     emirhanozkanContext db = new emirhanozkanContext(); 
     public List<PersonInfo> ListPersonInfo { set; get; } 
     public List<Profile> ListProfile { set; get; } 
    } 
} 

Mein Controller ist:

public ActionResult EditProfileInfo() 
     { 
      var nl = new AllProfile(); 
      nl.ListPersonInfo = db.PersonInfoes.ToList(); 
      nl.ListProfile = db.Profiles.ToList(); 
      return View(nl); 
     } 
     [HttpPost] 
     public ActionResult EditProfileInfo(AllProfile allprofile) 
     { 
      db.Entry(allprofile).State = System.Data.EntityState.Modified; 
      foreach (var item in allprofile.ListPersonInfo) 
      { 
       db.PersonInfoes.Where(x => x.id == item.id); 
       db.PersonInfoes.Where(x => x.Title == item.Title); 
       db.PersonInfoes.Where(x => x.Description == item.Description); 
      } 
      foreach (var item in allprofile.ListProfile) 
      { 
       db.Profiles.Where(x => x.id == item.id); 
       db.Profiles.Where(x => x.Title == item.Title); 
       db.Profiles.Where(x => x.Description == item.Description); 
      } 
      db.SaveChanges(); 
      return RedirectToAction("ProfileInfo"); 
     } 

Meine Ansicht ist:

@model emirhanozkan.Models.AllProfile 

@{ 
    ViewBag.Title = "EditProfileInfo"; 
} 

<h2>EditProfileInfo</h2> 

@using (Html.BeginForm(null, null, FormMethod.Post)) { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

    <fieldset> 

     <legend>PersonInfo</legend> 
     @foreach (var item in Model.ListPersonInfo) 
     { 
      @Html.HiddenFor(model => item.id) 
      <div class="editor-field"> 
       @Html.EditorFor(model => item.Title) 
       @Html.ValidationMessageFor(model => item.Title) 
      </div> 
      <div class="editor-field"> 
       @Html.EditorFor(model => item.Description) 
       @Html.ValidationMessageFor(model => item.Description) 
      </div> 
     } 
     @foreach (var item in Model.ListProfile) 
     { 
      @Html.HiddenFor(model => item.id) 
      <div class="editor-field"> 
       @Html.EditorFor(model => item.Title) 
       @Html.ValidationMessageFor(model => item.Title) 
      </div> 
      <div class="editor-field"> 
       @Html.EditorFor(model => item.Description) 
       @Html.ValidationMessageFor(model => item.Description) 
      </div> 
     } 

     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 
} 

Wenn ich auf die Schaltfläche Bearbeiten drücken db.Entry(allprofile).State = System.Data.EntityState.Modified; hat einen Fehler wie:

An exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll but was not handled in user code 
Additional information: The entity type AllProfile is not part of the model for the current context. 

Mein Sie mir helfen, diese Tabellen in einer Ansicht zu bearbeiten?

+1

Sie sehen diesen Fehler, weil Sie versuchen, den Status einer Datenbankentität 'allprofile 'auf Modifiziert zu setzen. 'allprofile' ist keine Datenbankeinheit, es ist ein Model. Es gibt viel mehr Fehler im Code, also, sobald Sie an diesem vorbeikommen, garantiere ich, dass Sie mehr treffen werden! – markpsmith

Antwort

0

Stimmen Sie mit markpsmith überein. Mein Vorschlag ist, Viewmodel zu erstellen, das die gleichen Eigenschaften wie Ihre Entität hat. Im Controller-Kartenansichtsmodell mit zwei Ihrer Entitäten gehen Sie dann nacheinander in die Datenbank.

0

Soweit ich sehen kann gibt es einen Fehler, in dem Sie versuchen, den Zustand eines Modells zu ändern. Beachten Sie, dass dies nicht explizit erforderlich ist. Wenn Sie Ihre Entitäten ändern, tun Sie das für Sie.

Anders als in Ihrer Post-Aktion ändern Sie nichts. Ich denke, das ist es, was Sie versuchen zu tun.

[HttpPost] 
public ActionResult EditProfileInfo(AllProfile allprofile) { 
foreach (var item in allprofile.ListPersonInfo) { 
var dbPerson = db.PersonInfoes.FirstOrDefault(x => x.id == item.id); 
dbPerson.Title = item.Title; 
    dbPerson.Title = item.Description; } 
     db.SaveChanges(); 
return RedirectToAction("ProfileInfo"); 
} 
Verwandte Themen