Asp.net MVC2 RTM の列挙可能なプロパティを使用したモデルの検証
-
21-09-2019 - |
質問
使っています DataAnnotations
モデルオブジェクトを検証するための属性。私のモデルクラスは次のようになります。
public class MyModel
{
[Required]
public string Title { get; set; }
[Required(ErrorMessage = "At least one editor is required.")]
public List<User> Editors { get; set; }
}
public class User
{
public int Id { get; set; }
[Required]
public string FullName { get; set; }
[Required]
[DataType(DataType.Email)]
public string Email { get; set; }
}
コントローラーのアクションは次のようになります。
public ActionResult NewItem(MyModel data)
{
if (!this.Model.IsValid)
{
// invalid processing
}
// valid processing
}
ユーザーには、次のフォームを含むビューが表示されます。
- ユーザーがユーザー名を入力するダミー名のテキスト ボックス。入力したユーザーごとに、ajax と組み合わせたクライアント スクリプトがあり、
<input type="hidden" name="Editors[0].Id" value="userId" />
入力されたユーザーごとに (したがって、ここで書かれているように列挙インデックスが常に 0 になるわけではありません)、デフォルトのモデル バインダーは問題なくフォームを使用してバインドできます。 - ユーザーがタイトルを入力するテキスト ボックス
使っているので、 Asp.net MVC 2 RTM 入力検証の代わりにモデル検証を行うものですが、検証エラーを回避する方法がわかりません。そしてユーザーが提供するので、 User.Id
, 、 全体 User
オブジェクト インスタンスは検証中です。他のプロパティの検証を除外する方法を知っている限り、これは気にしません。
問題は私が使わなければならないということです BindAttribute
コントローラーのアクションについて。物件のホワイトリストまたはブラックリストを提供する必要があります。ホワイト リストを提供することをお勧めします。また、将来性も高くなります。
問題
私のフォームは正常に動作しますが、ユーザーのフォームに関する検証エラーが発生します。 FullName
そして Email
プロパティは提供されていないためです。また、電子メールは個人の連絡先データであり、ユーザー間で共有されないため、(ユーザーがユーザーデータを入力するときに ajax 経由で) それらをクライアントにフィードするべきではありません。
ユーザー参照が 1 つだけある場合 MyModel
私なら書きます
[Bind(Include = "Title, Editor.Id")]
しかし、私はそれらの列挙を持っています。 どのように提供すればよいですか Bind
私のモデルで動作するホワイトリストは?
考えられる解決策の 1 つ
別のビューモデルを作成できます User
MyModel オブジェクトを入力するためだけです。実際の検証属性を入れて、必要のないプロパティを省略します。
public class MyModelUser
{
[Required]
public int Id { get; set; }
}
解決
結局、別のビューモデルを使用することになりました(「 考えられる解決策の 1 つ 私の質問では)、それは完全に検証できます。これは回避策ですが、適切に行う方法を知りたいと思っています。