2010-04-16 51 views
5

我使用xval在我的asp.net mvc2 web應用程序中使用客戶端驗證。儘管我在數字字段中輸入文本時發生了錯誤,但它仍會嘗試將表單發佈到數據庫。不正確的值將被替換爲0並保存到數據庫。但是,應該甚至不可能嘗試並提交表單。有人可以幫我從這裏出去嗎?C#mvc2客戶端驗證xval,阻止帖子

我設置如下屬性:

[Property] 
[ShowColumnInCrud(true, label = "FromPriceInCents")] 
[Required] 
//[Range(1, Int32.MaxValue)] 
public virtual Int32 FromPriceInCents{ get; set; } 

捕請求控制器看起來如下;這部分我沒有遇到任何錯誤。

[AcceptVerbs(HttpVerbs.Post)] 
[Transaction] 
[ValidateInput(false)] 
public override ActionResult Create() 
{ 
    //some foo happens 
} 

我的觀點看起來象下面這樣:

<div class="label"><label for="Price">FromPrice</label></div> 
<div class="field"> 
<%= Html.TextBox("FromPriceInCents")%> 
<%= Html.ValidationMessage("product.FromPriceInCents")%></div> 

,並在視圖我有以下規則,在HTML代碼生成正確的驗證規則結束

<%= Html.ClientSideValidation<Product>("Product") %> 

希望有人可以幫助我解決這個問題,提前致謝!

編輯:4月19日 我剛剛發現有一個正常的按鈕,而不是輸入類型=「按鈕」使用這可能是問題嗎?

<button class="save" type="submit" name="save"><span>Opslaan</span></button> 
+1

爲什麼你ValidationMessage( 「product.FromPriceInCents」),但你的文本框使用 「FromPriceInCents」?這似乎是可疑的。有什麼理由不使用強類型幫助器嗎? ValidationMessageFor(x => x.FromPriceInCents) – Jab 2010-04-16 14:59:35

+0

我將文本框和驗證消息更改爲強類型助手。但是這個改變並不影響驗證,不過好的提示! – Rob 2010-04-19 07:32:45

回答

0

爲什麼你將Range屬性註釋掉了?使用您指定的屬性,只要在文本框中輸入任何內容,就應該通過客戶端驗證。

+0

範圍屬性是一個測試。但我會嘗試重新看看會發生什麼。 – Rob 2010-04-16 14:31:23

+0

好吧,我試了一下,客戶端驗證是給這個錯誤; 請輸入1到2147483647之間的數值。 但是在firebug中,我可以看到頁面仍然嘗試做回發,但它返回下面的錯誤; '對象引用未設置爲對象的實例'。 – Rob 2010-04-16 14:35:17

+0

嘗試爲您創建的行動採取了對象類型這樣 公衆的ActionResult創建(對象類型NEWOBJECT) – MHinton 2010-04-16 16:24:18

2

我的第一個和主要關心的問題是:爲什麼你的應用首先將數據保存在數據庫中?雖然xVal是使應用程序用戶友好的好方法,但您仍然需要進行服務器端驗證。如果你沒有在服務器上驗證你的數據 - 你有一個重大的安全漏洞!嘗試在保存值之前檢查控制器中的ModelState.IsValid。

現在,從我看到你註冊使用

<%= Html.ClientSideValidation<Product>("Product") %> 

它的工作原理是它使客戶端驗證與「產品」爲前綴的所有控件的方式XVAL驗證。你在另一方面文本框有FromPriceInCents

的ID,因此這裏的解決辦法是要做到這一點:

<%= Html.TextBox("FromPriceInCents")%> 
<%= Html.ValidationMessage("FromPriceInCents")%> 

<%= Html.ClientSideValidation<Product>() %> 

UPD3 我更新了帖子。修復了代碼,以避免使用前綴。

此外,我編譯了一個包含工作解決方案的工作解決方案。列表,編輯,創建頁面,字符串和整型屬性以及xVal驗證。

public class Product 
{ 
    [ScaffoldColumn(false)] 
    public int Id { get; set; } 

    [Required] 
    [Range(1,50)] 
    public int PriceInCents { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string Name { get; set; } 
} 

,並在視圖

<%= Html.TextBoxFor(model => model.PriceInCents) %> 
<%= Html.ValidationMessageFor(model => model.PriceInCents) %> 

這裏的下載鏈接..檢查出來,並告訴我,如果它的工作原理 http://www.flexlabs.org/download/xValTest

+0

謝謝爲了良好的反應,我會嘗試你的解決方案並讓你知道。你對服務器端驗證是正確的,我確實仍然需要解決這個問題。 – Rob 2010-04-19 06:55:35

+0

我試着通過向文本框添加前綴來解決您的問題。但是驗證完全不起作用。當我像這樣使用它時; <%= Html.TextBox( 「FromPriceInCents」)%> <%= Html.ValidationMessage( 「product.FromPriceInCents」)%> <%= Html.ClientSideValidation ( 「產物」)%> 當我在一個期望數字的框中輸入文本時,驗證顯示錯誤。但是當我嘗試提交頁面時,它仍然在做一個回傳,這是我不期望並希望它做的事情。 得到了服務器端驗證現在使用Modelstate.IsValid – Rob 2010-04-19 07:40:47

+0

啊,是的,這是因爲創建方法不能從表單值中挑起值..我更新了帖子的例子 – 2010-04-19 08:26:07