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.netMVC2 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; }
}