2016-03-09 78 views
0

我的模型有一些字段不會在視圖中顯示(如Id字段)。asp.net中的隱藏字段mvc

所以,當我發佈表單時,這些字段返回「null」值,除非我在表單中插入隱藏字段。

還有另一種更新模型,只使用表單中的字段?

我的實際代碼:

[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

財產以後你能重建他們的服務器端?重新從數據庫中檢索,保持會話,...? – Maarten

+2

你應該使用ViewModels,否則你將不得不暴露你的數據庫實體結構的權利,以查看隱藏字段,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對象傳遞到您的視圖和您的帖子中。

您的文章控制器應該像

[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); 
}