2012-07-11 60 views
3

我一直在摸索,我沒能找到什麼似乎是一個簡單的要求一個答案:顯示驗證消息,但明確的價值

隨着MVC數據註釋驗證,可以顯示驗證消息('必須是最大長度爲5的字符串)在驗證摘要或字段旁邊,但清除文本框的值(驗證失敗時)。

我試過使用ModelState.Clear()ModelState.Remove("CompanyName"),但是這清除了兩個的值和驗證消息(驗證狀態)。

我在問這個問題,因爲最近我們進行了滲透測試,其中一項建議是,如果驗證失敗,其中一項建議不是預填充安全值(信用卡號碼等)。這顯然是一個小問題,但建議不要通過互聯網(從服務器)返回價值,如果我們不需要的話。

這是我的工作代碼:

public ActionResult Edit() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult Edit(CompanyInput input) 
{ 
    if (ModelState.IsValid) 
    { 
     return View("Success"); 
    } 
    //ModelState.Clear // clears both the value and validation message 
    //ModelState.Remove("CompanyName") // same result 
    return View(new CompanyInput()); 
} 

和視圖模型:

public class CompanyInput 
{ 
    [Required] 
    [StringLength(5)] 
    public string CompanyName { get; set; } 

    [DataType(DataType.EmailAddress)] 
    public string EmailAddress { get; set; } 
} 

和視圖:

@model Test.Models.CompanyInput 

<h2>Edit</h2> 

@using (Html.BeginForm("Edit", "Company")) 
{ 
    @Html.EditorForModel() 
    <button type="submit">Submit</button> 
} 
+0

這實際上很奇怪,你會發現'預先填充'的值,因爲如果模型無效,你會返回空的(新的CompanyInput())模型作爲視圖結果。你確定你發佈了正確的代碼示例嗎? – 2012-07-12 06:55:41

+0

@alexanerb是的,我的想法確切。是的,代碼示例是正確的。我也覺得很奇怪。 – 2012-07-12 07:14:50

+0

查看HTML,輸入初始化值?也可能是瀏覽器緩存輸入字段。 – 2012-07-12 16:22:58

回答

2

每個字段的ModelState不僅保存值,因此將它從集合中徹底刪除,並按預期刪除錯誤消息。我相信你應該能夠通過做類似的事情來清除價值。

ModelState["CompanyName"].Value = null; 

編輯:經仔細檢查我發現,Value屬性是ValueProviderResult型的,只需歸零它不會得到預期的結果,並因爲這個類的屬性似乎干將只有你有用您自己的實例替換實例。我測試了以下,它對我有用。

ModelState["CompanyName"].Value = new ValueProviderResult(string.Empty, string.Empty, ModelState["CompanyName"].Value.Culture); 
+0

我只是試了一下。這仍然顯示我在驗證失敗時輸入的*企圖*值。因爲我使用的是@ Html.EditorForModel,所以我想我遇到了這裏描述的問題:http://forums.asp.net/p/1527149/3687407.aspx。但是,我想知道是否有什麼明顯的我失蹤了。 – 2012-07-11 23:57:07

+0

啊對不起我的壞。我沒有仔細觀察和Value屬性的數據類型。這是一個'ValueProviderResult'。然而,這個屬性似乎只是獲取者。所以你必須用新的實例來替換它以獲得你想要的行爲。檢查我更新的答案。 – 2012-07-18 21:01:52

+0

是的!您編輯的代碼會清除該值。謝謝! – 2012-07-19 11:50:41

1

是的,你可以添加錯誤信息像這樣

[Required(ErrorMessage = "must be a string with a maximum length of 5")] 

OP的清晰度後更新:

要清除例如Input.Field = string.Empty;

+0

我不認爲你理解我的問題,對不起,如果我不清楚。即使我更改錯誤消息,我輸入的值(驗證失敗)也會預先填充到文本框中。我想顯示驗證消息,但清除文本框中的值(驗證失敗時)。 – 2012-07-11 22:59:10

+0

@dtryon在我的答案中檢查更新請致電 – HatSoft 2012-07-11 23:02:45

+0

我在哪裏放這段代碼?在我的控制器中,我得到:'該屬性或索引'System.Web.Mvc.ValueProviderResult.RawValue'不能在此上下文中使用,因爲set訪問器無法訪問' – 2012-07-11 23:06:50

1

您可以創建一個繼承自ValidationAttribute的類的自定義驗證類 以下鏈接爲如何實現適合您的問題的自定義驗證類提供了一個清晰的概念。

Custom Data Annotation

+0

您是否已經使用該工作?它不適合我。我認爲這是因爲這裏解釋的原因:http://forums.asp.net/p/1527149/3687407.aspx – 2012-07-11 23:23:37

+0

我剛剛測試它,它也工作,我測試給定的鏈接代碼,它也工作。另外請注意,在論壇中解釋的問題是關於MVC 2 Preview。 – saber 2012-07-11 23:37:30

+0

奇怪,你使用的是什麼版本?所以,你會看到字符串長度的驗證信息出現,但文本框是空的? – 2012-07-11 23:40:20

2

因爲ModelState中是無效的,你要麼必須創建一個自定義的驗證器或一個jQuery AJAX/JSON調用,以確定是否需要對數據進行清除或沒有。

只是將模型屬性更改爲string.Empty或類似的東西不會做到這一點,因爲整個視圖重新呈現與以前成功發佈的模型,但與ModelState驗證錯誤。

+0

是的,我認爲這是問題所在。那麼,自定義驗證器會重置「RawValue」屬性嗎?這看起來如何? – 2012-07-11 23:31:55

+0

此外,jQuery的調用(據我所知)仍然會從服務器返回輸入值。 – 2012-07-12 11:00:03