2012-05-16 82 views
3

我正在使用ASP.NET C#MVC2和我有以下數據註釋驗證模型中的以下字段屬性:如何刪除MVC2的驗證消息?

[DisplayName("My Custom Field")] 
[Range(long.MinValue, long.MaxValue, ErrorMessage = "The stated My Custom Field value is invalid!")] 
public long? MyCustomField{ get; set; } 

在表單這個領域應該允許用戶留空並顯示驗證消息應該是用戶嘗試輸入一個不能用數字表示的值。從驗證的角度來看,這是按預期工作並顯示以下錯誤消息:

聲明的我的自定義字段值無效!

「我的自定義字段」字段必須是數字。

第一個驗證消息是我編寫的自定義驗證消息,第二個驗證消息是MVC2自動生成的消息。我需要擺脫第二個,因爲它是多餘的。我該怎麼做呢?在我看來,我有以下的標記

<% Html.EnableClientValidation(); %> 
<% using (Html.BeginForm()) 
    { %> 
    <%:Html.ValidationSummary(false)%> 
    <% Html.ValidateFor(m => m.MyCustomField); %> 

回答

2

你這裏有這個問題是因爲被綁定的屬性是一個數字,和模型綁定自動處理的事實,字符串不能轉換爲數字。這不是RangeAttribute的行爲。

您可能會考慮將一個新的屬性作爲string並派生自己的RangeAttribute,它在字符串級別工作,首先解析數字。

然後你有你的現有屬性換行字符串:

[DisplayName("My Custom Field")] 
[MyCustomRangeAttribute(/* blah */)] //<-- the new range attribute you write 
public string MyCustomFieldString 
{ 
    get; set; 
} 

public int? MyCustomField 
{ 
    get 
    { 
    if(string.IsNullOrWhiteSpace(MyCustomField)) 
     return null; 
    int result; 
    if(int.TryParse(MyCustomField, out result)) 
     return result; 
    return null; 
    }  
    set 
    { 
     MyCustomFieldString = value != null ? value.Value.ToString() : null; 
    } 
} 

您的代碼可以繼續在int?物業工作很愉快,但是 - 所有的模型綁定的字符串屬性來完成。

您還可以最好將[Bind(Exclude"MyCustomField")]添加到模型類型 - 以確保MVC不嘗試並綁定int?字段。或者你可以製作它internal。如果它在Web項目中,並且只需要在Web項目中引用它。

你也可以考慮真正哈克的做法 - 並通過ModelState.Errors發現在你的控制器方法的錯誤,並返回視圖結果之前移除...

+0

嗨安德拉斯,感謝您的建議。我知道使用字符串作爲數據類型,但在這種情況下,我確實需要保持數據類型,我不能使用哈希方法。我需要將此解決方案應用於需要不斷支持的大型項目。 –

+0

不幸的是,那麼你必須考慮重新使用'DefaultModelBinder'--因爲我認爲這是驗證消息的起源。你說它確實需要保存爲'int';但根據我的經驗,您應該準備好在您的模型類型上更加靈活;除非你想寫很多自定義代碼。無論如何 - 我更新的代碼,你甚至不會注意到在後端的差異... –

+0

@WilliamCalleja對不起,我更新代碼之前寫了我的評論,認爲我會很快...現在更新。雖然我很害怕,但這並不是一個改變的答案。 –