4

私は周りを検索してきましたが、単純な要件のように見えるものについての答えを見つけることができません:

MVC データ注釈検証では、検証メッセージ (「最大長 5 の文字列である必要があります」) を検証の概要またはフィールドの横に表示できますが、テキスト ボックスの値はクリアできます (検証が失敗した場合)。

ModelState.Clear()とを使用しようとしましたが、これにより値と検証メッセージ (検証状態) の両方ModelState.Remove("CompanyName")がクリアされます。

これを尋ねているのは、最近侵入テストがあり、推奨事項の 1 つは、検証が失敗した場合に安全な値 (クレジット カード番号など)を事前入力しないことだったからです。これは明らかにマイナーな問題ですが、必要がない場合は、(サーバーから) インターネット経由で値を送信しないことをお勧めします。

ここに私が取り組んでいるコードがあります:

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> 
}
4

4 に答える 4

2

ModelState は有効ではないため、カスタム バリデーターを作成するか、jQuery ajax/json 呼び出しを作成して、データをクリアする必要があるかどうかを判断する必要があります。

モデル プロパティを string.Empty などに変更するだけでは、ビュー全体が以前に成功した投稿されたモデルで再レンダリングされますが、ModelState 検証エラーが発生するため、うまくいきません。

于 2012-07-11T23:26:54.170 に答える
2

各フィールドの ModelState は単なる値以上のものを保持しているため、コレクションから完全に削除すると、予想どおりエラー メッセージが削除されました。ただし、次のようなことを行うことで、値だけをクリアできるはずです。

ModelState["CompanyName"].Value = null;

編集:よく調べてみると、Value プロパティの型が であることがわかりましたValueProviderResult。単純に null にするだけでは目的の結果が得られません。また、このクラスのプロパティはゲッターのように見えるため、インスタンスを独自のものに置き換えるだけで済みます。私は以下をテストしましたが、それは私にとってはうまくいきます。

ModelState["CompanyName"].Value = new ValueProviderResult(string.Empty, string.Empty, ModelState["CompanyName"].Value.Culture);
于 2012-07-11T23:54:19.227 に答える
1

クラスから継承されたカスタム検証クラスを作成できますValidationAttribute。次のリンクは、問題に適したカスタム検証クラスを実装する方法について明確なアイデアを提供します。

カスタム データ注釈

于 2012-07-11T23:03:58.757 に答える
1

はい、このようなエラーメッセージを追加できます

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

OPからの明確化後に更新:

たとえば、Input.Field = string.Empty; をクリアします。

于 2012-07-11T22:54:16.010 に答える