1

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つの可能な解決策

UserMyModelオブジェクトを入力するためだけに、別のビューモデルを作成できます。実際の検証属性を配置し、不要なプロパティを省略します。

public class MyModelUser
{
    [Required]
    public int Id { get; set; }
}
4

1 に答える 1

1

完全に検証できる別のビューモデル(私の質問の1つの可能な解決策で説明されている)を使用することになりました。これは回避策であり、それを適切に行う方法を知りたいと思います。

于 2010-03-22T11:17:17.390 に答える