2016-03-09 2 views
0

Мои модели имеют некоторые поля, которые не должны быть представлены во взглядах (например, поле Id).Скрытые поля в asp.net mvc

Итак, когда я отправляю форму, эти поля возвращаются с «нулевым» значением, если я не вставляю в скрытые поля в форму.

Есть еще один способ обновить модель, используя только поля в форме?

Мой реальный код:

[HttpPost] 
[ValidateAntiForgeryToken] 
public IActionResult Create(Profissao model) 
{ 
    if (ModelState.IsValid) 
    { 
     using (var escopo = Db.Database.BeginTransaction()) 
     { 
      try 
      { 
       if (model.Id == 0) 
        Db.Profissoes.Add(model); 
       else 
        Db.Profissoes.Update(model); 

       Db.SaveChanges(); 
       escopo.Commit(); 

       return RedirectToAction("Index"); 
      } 
      catch (Exception) 
      { 
       escopo.Rollback(); 
      } 
     }     
    } 

    return View(model); 
} 
+0

Вы можете восстановить их на стороне сервера? Повторно получить из db, сохранить их в сессии, ...? – Maarten

+2

вы должны использовать ViewModels, иначе вам придется подвергать структуру сущности вашего DB право на поля View - hidden, ViewData и другие потенциально опасные структуры. И вы должны использовать эту ViewModel для сопоставления изменений, сделанных пользователем для вашего объекта СУБД. –

+0

Есть способы связать данные, отправляемые от клиента с желаемым объектом. Вопрос в том, почему бы не полагаться на 'Id'? Это, как правило, самая простая и безопасная ставка ... – haim770

ответ

2

Вы должны использовать (объекты передачи данных) DTO, чтобы справиться с этим.

public class User 
{ 
    public string Name { get; set; } 

    public string Passord { get; set; } 

    public string Email { get; set; } 
} 


public class UserDto 
{ 
    public string Name { get; set; } 

    public string Passord { get; set; } 

    public string Email { get; set; } 

    public UserDto FromModel(User user) 
    { 
     Name = user.Name; 
     Passord = user.Passord; 
     Email = user.Email; 
     return this; 
    } 

    public User UpdataModel(User user) 
    { 
     user.Name = Name; 
     user.Email = Email; 

     return user; 
    } 
} 

, то вы можете пройти объект Dto к своему виду и в своем посте.

ваш пост контроллер должен выглядеть Somthing как

[HttpPost] 
[ValidateAntiForgeryToken] 
public IActionResult Create(ProfissaoDto model) 
{ 
    if (ModelState.IsValid) 
    { 
     using (var escopo = Db.Database.BeginTransaction()) 
     { 
      try 
      { 
       if (model.Id == 0) 
        Db.Profissoes.Add(ProfissaoDto.UpdateModel(new Profissao())); 
       else 
var model = Db.Profissao.find(Model.id); 

        Db.Profissoes.Update(ProfissaoDto.UpdateModel(model)); 

       escopo.Commit(); 
       return RedirectToAction("Index"); 
      } 
      catch (Exception) 
      { 
       escopo.Rollback(); 
      } 

     }     
    } 
    return View(model); 
} 
Смежные вопросы