2013-06-09 9 views
5

Jestem nowy w asp.net mvc 4 i EF. Tworzę model użytkownika, który tworzy/aktualizuje informacje o użytkowniku. Kod modelu jest następujący:Jak uniknąć niektórych pól do zaktualizowania w modelu przy użyciu asp.net mvc 4

.... 
public int UserID { get; set; } 

[Required] 
public string UserName { get; set; } 

[Required] 
public string Password { get; set; } 

[Compare("Password")] 
public string VerifyPassword { get; set; } 
..... 
SOME OTHER FIELDS COMES HERE 
...... 

Ten sam model używany do tworzenia/aktualizowania aktywności. Działa to dobrze dla użytkownika tworzenia, ale podczas aktualizacji nie chcę, aby użytkownik zaktualizował swój identyfikator, nazwę użytkownika, więc będę go czytać tylko nie chcę wyświetlać hasła użytkownika/weryfikować pól hasła, więc usunąłem go z widoku. Teraz podczas aktualizacji (tryb edycji) zawsze otrzymuję komunikat o błędzie sprawdzania poprawności dla pola hasła. Tak więc moje pytanie brzmi: jak uniknąć aktualizacji tych pól i aktualizacji dla innych pól. Aby rozwiązać ten problem, próbuję stworzyć viewmodel, ale to mi nie pomaga. Dodano także kod z pominięciem sprawdzania takiego kontrolera:

public ActionResult Edit(User user) 
{ 
    ModelState.Remove("Password"); 
    ModelState.Remove("VerifyPassword"); 
    ModelState.Clear(); 
    if (ModelState.IsValid) 
    { 
    db.Entry(user).State = EntityState.Modified; 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
    } 
} 

To daje mi ModelState.IsValid = true, ale nie powiedzie się, aby zaktualizować. Proszę, daj mi rozwiązanie tego problemu.

góry dzięki ..

Odpowiedz

3
  1. Można ręcznie ustawić pola, które aktualizujesz tylko i zapisać zmiany.

  2. Najpierw można zresetować wartości pobrane z bazy danych. Coś jak poniżej (proszę wybaczyć ewentualne błędy)

    var userFromDb = db.Users.Where(u => u.UserID == user.UserID).First(); 
    user.Password = person.Password; 
    user.VerifyPassword = person.VerifyPassword; 
    
    db.Entry(person).CurrentValues.SetValues(user); 
    db.SaveChanges(); 
    
  3. Tworzenie niestandardowego modelu spoiwa, że ​​tylko aktualizuje odpowiednie pola.

+1

Dzięki za odpowiedź. Zrobiłem to samo, co powiedziałeś. Biorąc rekord przez UserID i ustawiam tylko te wartości, które chcę zaktualizować, z wyjątkiem hasła i innych pól, których nie chcę aktualizować. To działa dla mnie. Dzięki. – CodeWarrior

+0

Bez problemu, miło mi pomóc. – hutchonoid

+0

To pomogło również! Trochę poprawy: Car c = db.Cars.Find (car.Id); – stefan

0

Istnieje kilka sposobów adresowania problemu (opisane przez użytkownika hutchonoid w jego odpowiedzi). Domyślam się, że najlepszym wyborem byłoby nie używanie twojego User jako modelu dla widoku edycji, ponieważ nie jest to oczywiście jego celem w tym przypadku. Zamiast tego utwórz oddzielną klasę UserEditModel zawierającą wszystkie właściwości użytkownika, które chcesz mieć w swoim widoku edycji, i opatrz je adnotacjami z odpowiednimi atrybutami sprawdzania poprawności, tak jak robisz to normalnie. Następnie w widoku edycji zmień model formularza User na UserEditModel. W kontrolerze musisz coś podobnego do poniższego kodu:

[HttpGet] 
public ActionResult Edit(int userId) 
{ 
    var user = db.Users.SingleOrDefault(u => u.UserID == userId); 
    if user != null) 
    { 
     return View(UserUpdatModel.FromUser(user)); 
    } 
    // do whatever you do to handle errors 
} 

[HttpPost] 
public ActionResult Edit(UserUpdateModel user) 
{ 
    if (ModelState.IsValid) 
    { 
     var userToUpdate = db.Users.SingleOrDefault(u => u.UserID == user.UserID); 
     if (userToUpdate != null) 
     { 
      // update fields in userToUpdate with data from user 
      db.SaveChanges(); 
     } 
    } 
    // do whatever you do to handle errors 
} 

mam jakiś kod, pominięte dla uproszczenia (jak obsługa błędów lub treści UserEditModel - jego właściwości i metody, które FromUser utworzyć instancję sam w oparciu o dostarczone User). Nadzieja, która pomaga.

+0

Dzięki za odpowiedź. Używam framework entity do dostępu do danych, który automatycznie generuje wszystkie klasy modelu, takie jak User ect. Jak utworzyć nowy model, jak wspomniano powyżej. Stworzyłem encję użytkownika, która pokazuje User.tt pod moim plikiem .edmx, nie ma opcji, aby dodać do niej nowy model. Proszę mi powiedzieć, czy się mylę, ponieważ jestem nowy w MVC i EF. – CodeWarrior

+0

Domyślnym podejściem jest tworzenie modeli w folderze 'Modele' w projekcie. Po prostu dodaj nową klasę do folderu 'Models', nazwij ją' UserEditModel' i dodaj cały wymagany kod. Możesz go używać bez żadnych problemów w widokach i kontrolerach. – dmusial

+0

Czy to nie powoduje innego wywołania bazy danych, aby uzyskać oryginalne wartości dla zaktualizowanego użytkownika? – isaolmez

Powiązane problemy