2012-09-11 49 views
1

財產這是我的用戶模型的樣子:MongoDB的C# - 隱藏串行

namespace Api.Models 
{ 
    public class User 
    { 

     [BsonId(IdGenerator = typeof(StringObjectIdGenerator))] 
     [BsonRequired] 
     public string Id { get; set; } 

     [Required(ErrorMessage = "Username is required.")] 
     [StringLength(20, MinimumLength=3, ErrorMessage="Username must be between 3 and 20 characters.")] 
     [BsonRequired] 
     public string Username { get; set; } 

     [Required(ErrorMessage="Email is required.")] 
     [EmailAddress(ErrorMessage="Valid email required.")] 
     [BsonRequired] 
     public string Email { get; set; } 

     [Required(ErrorMessage = "Password is required.")] 
     [StringLength(50, MinimumLength=8, ErrorMessage="Password must be between 8 and 50 characters.")] 
     [BsonRequired] 
     public string Password { get; set; } 

     [BsonRequired] 
     public string Salt { get; set; } 

    } 
} 

我想寫點什麼,並要求,所有的屬性到的MongoDB數據庫。我不想做的,是揭示密碼屬性,當我通過請求發送此。

是否有任何一種數據屬性,我可以設置它會寫它,但不顯示任何API用戶時顯示?

+0

你是什麼意思的「暴露」?怎麼樣? –

+0

說通過POST創建一個用戶,然後發回模型給用戶,我想鹽和密碼保存在mongoDB中,但不發送回瀏覽器/用戶 – ehftwelve

回答

2

正確的方法是使用視圖模型。不要將您的域實體傳遞給視圖。設計視圖模型,符合您的觀點的具體要求。因此,例如設計一個沒有Password和Salt屬性的視圖模型,因爲這是這個視圖所需要的。然後,爲了簡化域模型和視圖模型之間的映射,您可以使用AutoMapper

如果您不想遵循視圖模型的良好實踐,您仍然可能會使用綁定屬性混亂您的POST操作,並決定要將哪些屬性包含/從模型綁定中排除。例如:

[HttpPost] 
public ActionResult SomeAction([Bind(Exclude="Password,Salt")]User user) 
{ 
    // at this stage the Password and Salt properties will always be null => 
    // they will never be bound from the request even if the user attempts to 
    // forge an HTTP request and include them 
    ... 
} 
+0

謝謝,我會研究這個。我對C#非常陌生(我是一個JavaScript傢伙),但對此很喜歡。我會看看你的建議。 – ehftwelve

+0

快速的問題,這是一個Web API的asp.net mvc項目,將以同樣的方式查看模型工作,還是他們只是爲了掛鉤模板? – ehftwelve

+0

您仍然可以使用視圖模型並讓您的API控制器操作將它們作爲參數或將其作爲結果返回。通過這種方式,您可以完全控制什麼被序列化爲這些操作的輸入/輸出。然而,在這些動作中,您當然會將它們映射到您的真實域模型以執行實際處理。 –