2009-06-01 53 views
5

我使用的複選框的ASP.NET MVC形式就像這樣:asp.net的MVC複選框不一致

<%=Html.CheckBox("AgreeToRules", Model.AgreeToRules)%> 

模型上的AgreeToRules屬性是一個布爾值。在測試過程中,這一切都運行良好。然而,現在我們已經活了這個程序,我看到一個比較小的,但顯著一些錯誤有以下消息:

System.Web.HttpUnhandledException: 型「系統的異常。 Web.HttpUnhandledException' 被拋出。 ---> System.InvalidOperationException: 參數從類型 「System.String」轉換爲類型 'System.Boolean'失敗。有關更多信息,請參閱內部 例外。 ---> System.FormatException:Y不是布爾的有效值 。 ---> System.FormatException:字符串不是 被識別爲有效的布爾值。

這似乎當視圖引擎嘗試後後呈現的形式出現,而從ValueProvider返回的複選框的值是這樣的:

Y,假

OR

N,假

是在原來的形式呈現的HTML看起來像:

<input id="AgreeToRules" name="AgreeToRules" type="checkbox" value="true" /> 
<input name="AgreeToRules" type="hidden" value="false" /> 

在測試過程中,我希望(和顯示)張貼值的樣子:

真,假

如果檢查或

發lse

如果未選中。那麼N和Y從哪裏來?

我將用戶代理添加到從錯誤處理程序返回的信息列表中,並且它出現(到目前爲止)所有錯誤都出現在帶有FF 3.0.10的Windows XP下,但這正是我已經測試過的和測試過程中不存在這個問題。

有什麼想法?

+0

Y和n我們用普通的HTML代碼替換助手解決了嗎?這不就是什麼Microsoft Jet(由Access使用)用於其布爾字段? – Powerlord 2009-06-01 19:17:00

+0

也許,但由於這與Jet或Access無關,我不確定它是否相關。 – Chris 2009-06-01 19:20:05

+0

要發佈一些我現在刪除的答案:我剛剛檢查了HTML規範,並且複選框的默認值暗示爲「on」沒有給出值;我不知道Y或N可能來自哪裏,除非它是ASP.NET MVC特定的。 – Powerlord 2009-06-01 19:26:49

回答

1

嗯,我發現這個問題,並認爲我會在這裏發佈它,以防其他人遇到它。某些表單填充程序會使用我用過的名稱來檢測字段,並通過將該值設置爲用戶以前用於類似名稱字段的任何值來自動「填充它們」。從昨晚開始,我還收到了「UNSUBSCRIBED」和「SUBSCRIBED」作爲名爲「OptIn」的複選框的值。

因此,表單填充將複選框的值更改爲某些內容,並且用戶檢查該框,導致將意外的值傳輸到服務器。

任何處理這個問題的想法將不勝感激。

1

很可能您的網站遭到提交此值的垃圾郵件而不是真正的用戶。我添加自動日誌記錄和電子郵件的站點越多,這些類型的「探測器」和錯誤(儘管不完全是您提到的類型,對於複選框爲「Y」),我看到它們堆積在我的收件箱中。您的日誌記錄是否也捕獲了提交的表單內容的其餘部分?

1

今天我想出了一個類似的問題的解決方案,可能會適應您的特殊需要。它會爲你所要求的「做好工作」,但可能不是最可重用的解決方案。

這個想法是,你將通過發佈的表單字段,並修復「破」複選框的值。你可以創建一個ValueProviderDictionary a.k.a. IDictionary <字符串,ValueProviderResult >然後把它交給你的UpdateModel方法。

public static IDictionary<string, ValueProviderResult> CreateScrubbedValueProvider(NameValueCollection postedForm, string[] checkboxFieldsToScrub) 
{ 
    Dictionary<string, ValueProviderResult> dict = new Dictionary<string, ValueProviderResult>(); 
    foreach (string key in postedForm.AllKeys) { 
     string[] values = postedForm.GetValues(key); 
     if (checkboxFieldsToScrub.Contains(key)) { 
      // Ensure we have a "true" value instead of "Y" or "YES" or whatever... 
      // Note that with a checkbox, only the first value matters, so we will only 
      // worry about values[0] and not values[1] (the "unchecked" value, if exists). 
      if (values[0] == "Y" || values[0] == "YES") { 
       values[0] = "true"; 
      } 
     } 
     string value = String.Join(",", values); 
     ValueProviderResult vpr = new ValueProviderResult(values, value, null); 
     dict.Add(key, vpr); 
    } 
    return dict; 
} 

你的控制器將需要接受其參數的NameValueCollection(或的FormCollection),你會需要你的手產生(「擦洗」)值提供商字典到的UpdateModel方法。我沒有完全測試過,但我的版本對我來說工作非常類似。祝你好運!

2

我們在一個正在進行的項目(MVC 2)上發生過同樣的問題。

前: <%= Html.CheckBox("Credit", false, new {@validate = "required"}) %>

後:

<input type="checkbox" name="Credit" value="true" validate="required" /> 
<input type="hidden" name="Credit" value="false" />