2013-02-26 118 views
0

我有一個簡單的MVC模式,像這樣:驗證失敗的 'ID' 字段

public class SomeClass 
{ 
    public int Id { get; set; } 

    [Required(ErrorMessage = "Please provide a name for the blah blah blah")] 
    public string Name { get; set; } 
} 

...我有像這樣(簡體)一個觀點:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CompanyName.Web.Models.SomeClassViewModel>" %> 

<form method="post" action="/someclass/add"> 
    <%=Html.HiddenFor(m => m.SomeClass.Id)%> 

    <div> 
     <%=Html.LabelFor(m => m.SomeClass.Name)%> 
     <%=Html.TextBoxFor(m => m.SomeClass.Name, new { @class = "form-medium" })%> 
    </div> 
</form> 

在表單提交,我的控制器驗證ModelState像這樣:

[HttpPost] 
public ActionResult Add(Models.SomeClassViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     ... 
    } 
} 

我得到的

模型驗證錯誤

「Id字段是必需的。」

這是爲什麼發生?

Id字段默認情況下被賦值爲0(因爲它應該),然後它將被傳遞到數據層以創建記錄,所以我沒有看到問題是什麼?

任何幫助,將不勝感激。

+0

何時/何處將'Id'字段設置爲0? – brazilianldsjaguar 2013-02-26 16:52:05

+0

您的ID字段是數據庫中的標識字段嗎? – TGlatzer 2013-02-26 16:53:09

+0

使id爲空可能會解決這個問題,因爲MVC可能需要一個值類型(int)的值,但是如果id最初應該爲0(不僅僅是null),您可能需要等待更好的答案。 – 2013-02-26 16:54:00

回答

0

好了,我發現了這個問題。

在我的視圖模型類('SomeClassViewModel')的構造函數中,我添加了一行代碼,它稱爲'SomeClass'屬性的默認構造函數。

我想通過檢查'Id'驗證碼的ModelState錯誤並看到'AttemptedValue'屬性是一個空字符串,它應該是0.它將該屬性實例化爲'SomeClass ' 修復。

我希望這可以幫助有人可能在同一個問題!

0

如果更改爲Id變量的名稱或將數據類型更改爲字符串,會發生什麼情況?

0

確保Models.SomeClassViewModel類也具有相同類型和變量名稱的Id字段。

如果不是的話,你也可以試試這個:

[HttpPost] 
public ActionResult Add(SomeClass model) 
{ 
    if (ModelState.IsValid) 
    { 
     ... 
    } 
} 
+0

這將不起作用,因爲表單內的輸入字段名稱前綴爲SomeClass.'。 – 2013-02-26 16:59:33

+0

呃,夠公平的。只要'Models.SomeClassViewModel'具有'Id'字段,它應該沒問題。 – rhughes 2013-02-26 17:21:47

+0

爲什麼要將Id添加到視圖模型類會停止在模型類上發生驗證錯誤? – clarkeeuk99 2013-02-26 17:28:10