Wie behalten Sie den ursprünglichen Wert für einige Feld beim ausführen von Bearbeiten auf MVC?
Wie Sie wissen, Wenn wir wollen, zu Ändern-Daten, werden Wir gehen Sie auf Seite Bearbeiten:
public ActionResult EditAdmin(int UserId)
{
User user = persons.Users.Find(id);
return View(user);
}
Dann reichen Wir es auf der Edit-Seite, wird es Ändern:
public ActionResult EditAdmin(User user)
{
persons.Entry(user).State = EntityState.Modified;
persons.SaveChanges();
}
Aber das problem ist , ich habe eine Menge von Feld - brauchen nicht geändert werden,:
public class User{
public int UserId {get; set;} //do not need modify
public int Password {get; set;} //do not need modify
public string Name {get; set;}
public bool Sex {get; set;}
public DateTime AddTime {get; set;} //do not need modify
}
Offensichtlich, ich kann nicht anzeigen, einige Feld auf meiner Seite Bearbeiten verwenden Versteckt, weil ich nicht wollen, dass es die Anzeige auf der Benutzeroberfläche. aber, wenn senden, dass ich es noch brauchen immer noch den ursprünglichen Wert. So Ist es eine gute Idee für Sie? Dank
Update1:
Warum kann ich nicht verwenden, wie
entry.Property(e => e.Password).IsModified = false;
link: https://stackoverflow.com/a/18004476/1900498
Aber Es wird angezeigt :
Validierung fehlgeschlagen ist, für eine oder mehrere Personen. Sehen
'EntityValidationErrors' - Eigenschaft für weitere details.
Benötigen Sie einen neuen Wert für alle geänderten Felder. Sie können auch übernehmen Sie die nicht-geänderten Wert für die anderen modifizierbaren Feldern. Aber warum denken Sie, müssen Sie den alten Wert für den nicht-modifizierbaren Felder? Sie nicht (mit Ausnahme der primary key und optimistische concurrency-version oder der Zeitstempel, natürlich).
InformationsquelleAutor qakmak | 2014-10-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Holen die bestehende version aus der Datenbank, und ändern Sie dann nur die 'veränderbar' Felder:
Bearbeiten
Siehe auch @Kris' Kommentar und Ric ' s Punkt über das erstellen von maßgeschneiderten Modelle ansehen und daher NICHT verschmutzen Ihre Ansichten mit ORM /Daten-tier-Einheiten. Ich habe auch noch behaupten, Sie brauchen, um eine timestamp-oder hash-durch das ViewModel zu verhindern, dass die
last one wins
überschreiben problem.EntityState.Modified
? Die EF-proxy sollte in der Lage dieseGuter Punkt - es ist nicht eine freistehende Einheit. Danke.
Dies erfordert die action-Methode zum Lesen und schreiben Sie dann die Zeile, die zwei roundtrips zur Datenbank, wo technisch nur einen roundtrip erforderlich. Die select-liest alle "änderbar" - Felder, um sicherzustellen, das update sendet nur diejenigen, die tatsächlich geändert werden. In der Tat, wenn die Entität enthält alle Spalten in der Tabelle, Lesen Sie sich diese alle, und nicht nur die "modifizierbar". Auf der anderen Seite, mit einer hin-und Rückfahrkarte, die Sie in der Tat nicht wissen, welche Felder geändert wurden, so dass die update-Anweisung senden "änderbar" - Spalten der Datenbank. Frage: was ist schlimmer?
Warum
x.FirstOrDefault()
nichtx.Find()
?Ja, Sie können
Find
, wenn Sie sicher sind, dass es keine Möglichkeit gibt, Sie haben eine veraltete context. Kris - ja, ich war der Annahme, ein Bedarf für eine optimistische Parallelität überprüfen, und auch dafür zu sorgen, dass ein browser-Benutzer hat nicht die hack JSON / POST-und liefern die aktualisierten Werte für Id, Passwort etc. an. Ich denke die optimale Lösung wäreUPDATE Person SET Name = {NewName}, Sex = {NewSec} WHERE ID = {OldId} AND LastUpdateTimeStamp={LastUpdateTimeStamp}
ist, und dann werfen einOptimisticConcurrencyException
wenn die Zeilen aktualisiert, die war gleich null, aber thisn nicht sehr ORMish.InformationsquelleAutor StuartLC
Option 1:
Könnte man eine readonly Attribut:
Etwas wie:
Mach dir keine sorgen über die
@Value
Teil, da dies ermöglicht es mir zum Aufruf einer action-Methode, um automatisch einen Wert generieren.Im Kontext, würde dir so Aussehen:
Bitte Beachten Sie
Diese Antwort bezieht sich auf die Verwendung razor view Motor.
Option 2:
Andere Möglichkeit wäre die Verwendung einer anderen
viewModel
insgesamt:"Und dann" füllen "Ihre Daten mit Hilfe dieses in Ihrem" Bearbeiten ActionResult.
von dort aus könnten Sie dann die Werte in deine [HttpPost] Action-Methode unter Verwendung von linq (oder anderes), dann vor dem speichern in die Datenbank.
Option 3: Verwendung ViewBags
da Sie nur auf der Suche nach edit 2 Teile Ihres Modells, können Sie nur wollen, verwenden Sie die
ViewBag
:Controller:
Anzeigen:
Dann in Ihrer post-Methode, könnte man hinzufügen, diese als string-Parameter:
InformationsquelleAutor
Sie könnten und sollten eigentlich zu einem bestimmten viewmodel für Ihre Seite Bearbeiten. Wie:
Dann anstatt die komplette Benutzer-und aus der Sicht, verwenden Sie die UserViewModel.
id
in die post-Methode?Ja, das war ein Fehler. Bearbeitet die Antwort. Komisch, niemand sonst habe das in 3 Jahren. Werden Sie wahrscheinlich wollen, um die Id-Feld in der UserViewModel in einem versteckten Eingang in Ihre razor-Ansicht
Vielen Dank für die Bewältigung dieser. Jedoch, auf diese Weise sind wir wieder bei der ursprünglichen Frage, die die Notwendigkeit zu "verstecken", die bestimmte Eigenschaften immer manipuliert durch den AUFTRAGGEBER. Wenn Sie verlassen sich auf das Modell wie Sie es hier gemacht haben, kann der Benutzer ändern das versteckte Feld (Benutzer-id) in JavaScript und kann die Ursache für ein update an einen anderen Benutzer. Die Art, wie ich arbeitete, um dieses ist mit TempData zu speichern, die ID. Die gute Sache über
TempData
ist, das dauert zwischen Anforderungen. Ich bin mir nicht sicher, ob das der beste Weg obwohl.Der OP sagt nichts über Manipulation. Die Frage ist nicht über das ändern von Daten, die nicht geändert werden sollten. Diese Antwort löst dieses Problem, da nur die Eigenschaften, die geändert werden können, werden geändert. Das ändern der Frage ist eine Frage der Sicherheit erfordert eine völlig andere Antwort. Ich habe eine Antwort für Sie, dass auch die, die nicht mit TempData. Wenn Sie Informationen brauchen, über das, erstellen Sie eine neue Frage und tag mir
Du hast Recht. Der OP erwähnt nicht die Sicherheit. Ich scheinbar den Punkt verpasst, die hinter der Frage.
InformationsquelleAutor Ric .Net
Hier ist etwas, was ich nur gelernt, wie man für die Buchung der Daten in eine Datenbank und ausschließen von anderen Bereichen. Ich wollte nur post 1 ändern, um meine Datenbank auf PIVPrinted checkbox.
InformationsquelleAutor nolanfilm
Mit der Razor view engine, können Sie markieren Sie den Eintrag, wie versteckt:-
Oder nur diese, die ist einfacher:-
InformationsquelleAutor user2284063
Wenn Sie nicht wollen, verwenden Sie versteckt in anzeigen, müssen Sie laden Sie Ihre Einheit aus dem db und fügen Sie Ihre änderungen, wie
InformationsquelleAutor M.Azad
Keine Notwendigkeit, etwas anderes zu tun, nur eine Liste der Konstanten Werte wie Razor-Syntax.
Dies war für mich auch, aber wie zeige ich das Datum auf meiner Seite? Ich will ihn nicht versteckt, weil die Benutzer wollen wissen, Wann die Anfrage ursprünglich vorgelegt - in meinem Szenario. Danke
InformationsquelleAutor Emre Sevim
Für das ändern von nur ein paar Felder, auf die ich den folgenden code verwenden, und ich denke, auch Sie können es nutzen.
InformationsquelleAutor Rom
einfache und einfache Lösung ist die Verwendung von sessions. Im Edit-get-Methode nur session erstellen und Wert zuweisen, der das Objekt zum Beispiel.
nun im Edit-Post-Methode setzen Sie den Wert
nur im Edit-post-Methode werden Sie überprüfen Sie den Zustand, wenn Ihr bestimmtes Objekt den Wert null hat.
InformationsquelleAutor Hassan Raza