webentwicklung-frage-antwort-db.com.de

Wie bleibt der ursprüngliche Wert für ein Feld erhalten, wenn Sie Edit in MVC ausführen?

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.

13
qakmak

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();
}
  • Möglicherweise möchten Sie auch eine optimistische Parallelitätsprüfung durchführen, um sicherzustellen, dass die zu aktualisierende Version tatsächlich aktuell ist. Wenn Sie einen Zeitstempel haben, verwenden Sie diesen idealerweise, andernfalls müssen Sie alle Felder vergleichen.

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.

18
StuartLC

Option 1:

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.


Option 2:

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.


Option 3: ViewBags verwenden

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)
{
 ...
10
user3913686

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();
}
6
Ric .Net

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");
3
nolanfilm

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)
2
user2284063

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();
1
M.Azad
 @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.

1
Emre Sevim

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.

0
Hassan Raza

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()          
 }
0
Rom