Wie Sie wissen: Wenn wir Daten ändern möchten, gehen wir zur Seite Bearbeiten:
public ActionResult EditAdmin(int UserId)
{
User user = persons.Users.Find(id);
return View(user);
}
Dann senden wir es auf der Bearbeitungsseite ein, es wird sich ändern:
public ActionResult EditAdmin(User user)
{
persons.Entry(user).State = EntityState.Modified;
persons.SaveChanges();
}
Aber das Problem ist, ich habe eine Menge von Feld muss nicht modifiziert 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
}
Natürlich kann ich kein Feld auf meiner Bearbeitungsseite mit Hidden anzeigen, da es nicht auf der Benutzeroberfläche angezeigt werden soll. aber wenn ich es einschalte, brauche ich es immer noch behält den ursprünglichen Wert. Gibt es eine gute Idee dafür? Vielen Dank
Update1:
Warum kann ich nicht gerne verwenden
entry.Property(e => e.Password).IsModified = false;
link: https://stackoverflow.com/a/18004476/1900498
Aber es wird angezeigt:
Die Überprüfung für eine oder mehrere Entitäten ist fehlgeschlagen. Sehen 'EntityValidationErrors'-Eigenschaft für weitere Details.
Rufen Sie die vorhandene Version aus der Datenbank ab und ändern Sie dann nur die Felder, die Sie ändern können:
public ActionResult EditAdmin(User user)
{
var currentPerson = db.Persons.FirstOrDefault(p => p.id = user.id);
if (currentPerson == null)
return HttpNotFound();
currentPerson.Name = user.Name;
currentPerson.Sex = user.Sex;
// Id and Password are not updated.
db.SaveChanges();
}
Bearbeiten
Siehe auch den Kommentar von @Kris und Ric's Standpunkt zur Erstellung maßgeschneiderter Ansichtsmodelle und damit zum NICHT-Verschmutzen Ihrer Ansichten mit ORM/Datenebenenentitäten. Ich behaupte auch immer noch, dass Sie einen Zeitstempel oder einen Hashwert durch das ViewModel tragen müssen, um das last one wins
-Überschreibungsproblem zu verhindern.
Sie können ein readonly -Attribut verwenden:
So etwas wie:
@Html.EditorFor(model => model.DriverID, new { htmlAttributes = new {
@Value = @Html.Action("getNextDriverID"), @readonly = "readonly"} })
Machen Sie sich keine Sorgen über den @Value
-Teil, da ich so eine Aktionsmethode aufrufen kann, um automatisch einen Wert zu generieren.
Im Kontext würde dein aussehen:
@Html.EditorFor(model => model.UserId, new { htmlAttributes = new {@readonly = "readonly"} })
Bitte beachten Sie
Diese Antwort bezieht sich auf die Verwendung von Razor View Engine.
Eine andere Option wäre die Verwendung einer anderen viewModel
insgesamt:
public class edit User{
public int userId {get; set;}
public string Name {get; set;}
public bool Sex {get; set;}
}
Und dann "füllen" Sie Ihre Daten damit in Ihrem `Edit ActionResult.
von dort könnten Sie dann die Werte in Ihrer Action-Methode [HttpPost] mit (linq oder anders) festlegen, bevor Sie sie in Ihrer Datenbank speichern.
da Sie nur 2 Teile Ihres Modells bearbeiten möchten, möchten Sie möglicherweise nur die Variable ViewBag
verwenden:
Regler:
ViewBag.Item1 = xyz;
ViewBag.Item2 = xyz;
Aussicht:
@Html.TextBox("Item1")
@Html.TextBox("Item2")
In Ihrer Post-Methode können Sie diese als String-Parameter hinzufügen:
public ActionResult Edit(string Item1, string Item2)
{
...
Sie könnten und sollten ein bestimmtes Ansichtsmodell für Ihre Bearbeitungsseite erstellen. Mögen:
public class UserViewModel
{
public string Name {get; set;}
public bool Sex {get; set;}
}
Verwenden Sie dann anstelle des vollständigen Benutzers zu und von der Ansicht das UserViewModel.
public ActionResult EditAdmin(int userId)
{
User user = persons.Users.Find(userId);
return View(new UserViewModel
{
Id = user.Id,
Name = user.Name,
Sex = user.Sex
});
}
[HttpPost]
public ActionResult EditAdmin(UserViewModel user)
{
var dbUser = persons.Users.Find(user.Id);
dbUser.Name = user.Name;
dbUser.Sex = user.Sex;
persons.Entry(dbUser).State = EntityState.Modified;
persons.SaveChanges();
}
Ich habe gerade gelernt, wie man die Daten in eine Datenbank stellt und andere Felder ausschließt. Ich wollte nur eine Änderung in meiner Datenbank über das Kontrollkästchen PIVPrinted veröffentlichen.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult PrintDetails([Bind(Include = "PatientID,LastName,FirstName,PatientDOB,PIVCompleted,PIVPrinted")] PIV pIV,
string command)
{
if (command.Equals("Print Completed"))
{
pIV.PIVPrinted = false;
db.Entry(pIV).State = EntityState.Unchanged;
db.Entry(pIV).Property("PIVPrinted").IsModified = true;
db.SaveChanges();
return RedirectToAction("PrintDetails");
Mit der Razor View Engine können Sie den Eintrag als ausgeblendet markieren: -
<div class="form-group" style="visibility:hidden;height:0px;">
@Html.EditorFor(model => model.CreationDate)
@Html.ValidationMessageFor(model => model.CreationDate, "", new { @class = "text-danger" })
</div>
Oder nur das, was einfacher ist: -
@Html.HiddenFor(model => model.CreationDate)
Wenn Sie die Ansicht nicht in der Ansicht verbergen möchten, müssen Sie Ihre Entität aus db laden und Ihre Änderungen wie hinzufügen
var olduser= db.Persons.FirstOrDefault(p => p.id = user.id);
olduser.Name=user.Name;
olduser.Sex=user.Sex;
persons.SaveChanges();
@Html.HiddenFor(model => model.UserId)
@Html.HiddenFor(model => model.Password)
@Html.HiddenFor(model => model.AddTime)
Sie müssen nichts weiter tun, listen Sie die konstanten Werte einfach als Razor-Syntax auf.
einfache und einfache Lösung ist die Verwendung von Sitzungen. Erstellen Sie in der Edit-Methode einfach eine Sitzung und weisen Sie zum Beispiel den Wert dieses bestimmten Objekts zu.
Session["ProfilePic"] = personnel.ProfilePic;
setzen Sie jetzt in der Edit Post-Methode den Wert
personnel.ProfilePic = Session["ProfilePic"].ToString();
offcourse In der Edit post-Methode prüfen Sie die Bedingung, wenn Ihr Objektwert null ist.
Um nur einige Felder zu ändern, verwende ich den folgenden Code, und ich denke, auch Sie können davon Gebrauch machen.
if (ModelState.IsValid)
{
var action = this.db.DbcontextName.Find(int.Parse(id));
db.Entry(action).Property("Status").CurrentValue = "YourString/Data";
db.SaveChanges()
}