2016-12-06 60 views
0

我目前正在研究一個基本的asp.net mvc應用程序。今天,我遇到了一個奇怪的問題:ModelState無效,對象正常嗎?

[HttpPost] 
[Authorize] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Create([Bind(Include = "Url, Homepage, Language, Country, Name")]FeedModel feedModel) 
    { 
     feedModel.Id = Guid.NewGuid().ToString();  
     feedModel.UserId = User.Identity.GetUserId(); 

     Debug.WriteLine(feedModel.UserId); 

     if (ModelState.IsValid) 
     { 
      db.Feeds.Add(feedModel); 
      await db.SaveChangesAsync(); 
      return RedirectToAction("Index"); 
     } 

     return View(feedModel); 
    } 

顯然,ModelState.IsValid永遠是假的,根據VS調試工具由於用戶ID值是零。但是,使用Debug.WriteLine,feedModel.UserId顯示正確。

該功能是關於從視圖接收信息,添加Id和UserId的值。

這是feedModel級:

public class FeedModel 
{ 
    [Key] 
    public string Id { get; set; } 
    [Required] 
    public string UserId { get; set; } 
    [Required] 
    public string Url { get; set; } 
    [Required] 
    public string Homepage { get; set; } 
    [Required] 
    public string Language { get; set; } 
    [Required] 
    public string Country { get; set; } 
    [Required] 
    public string Name { get; set; } 
} 

我在做什麼錯呢?

在此先感謝!

+0

您是否重複了模型狀態錯誤以查看哪些錯誤? – Fran

+1

您將需要[重新驗證模型](http://stackoverflow.com/questions/6360087/manually-invoking-modelstate-validation) – Jasen

回答

4

您只是在帖子中綁定這些值(Url,主頁,語言,國家,名稱),但您的模型根據需要具有Id和UserId。 Model.IsValid設置在您的控制器操作執行之前的綁定時間。僅僅因爲您在方法中設置了Id和UserId並不會改變模型無效的事實。

+0

好的,謝謝你的快速響應!它似乎現在工作得很好,我刪除了[required],但我可能會在稍後使用視圖模型。 –

3

當模型綁定進程發生時,ModelState被設置。 在你的情況下,feedModel.UserId = User.Identity.GetUserId();聲明不會改變ModelState。因此,這個問題。 您可以通過使用驗證器等不同機制來檢查模型的有效性。 如果您不想使用其他機制,則可以設置UserId屬性public string UserId { get; set; } = User.Identity.GetUserId();的默認值,或者您可以簡單地從該屬性中刪除Required屬性,以便它不會反映在ModelState中。

+3

問題是,它看起來像他試圖使用ef域模型作爲視圖模型,所以他可能只是不能從Id和UserId中刪除[Required]屬性。更好的解決方案是創建一個單獨的視圖模型,只包含他需要的視圖。 – Fran