0

既存のポータルを Web フォームから MVC に再構築していますが、検証に問題があります。私はこのモデルのようなものを持っています:

public class Customer
{
    [RequiredIf("FirstNameRequired", true)]        
    [Display(Name = "First Name")]
    public string FirstName { get; set; }
    public bool FirstNameRequired { get; set; }
    public bool FirstNameVisible { get; set; }

    [RequiredIf("LastNameRequired", true)]
    public string LastName { get; set; }
    public bool LastNameRequired { get; set; }
    public bool LastNameVisible { get; set; }

    [RequiredIf("EmailRequired", true)]
    public string Email { get; set; }
    public bool EmailRequired { get; set; }
    public bool EmailVisible { get; set; }
}

public class PersonalInfo
{
    public Customer PrimaryCustomer { get; set; }
    public IEnumerable<Customer> Customers { get; set; }
}

顧客には多くのプロパティがありますが、たとえば 3 つ追加しました (100 など)。多くの連絡先タイプがあり、visible や required などのプロパティが動的であるため、私はこのようにしています。これで、すべての顧客をレンダリングするエディター テンプレートができました。こんな感じです。

@if (Model.FirstNameVisible)
{ 
    <p>
        First Name:
        @Html.TextBoxFor(x => x.FirstName)
    </p>
}
@if (Model.LastNameVisible)
{ 
    <p>
        Last Name:
        @Html.TextBoxFor(x => x.LastName)
    </p>
}
@if (Model.EmailVisible)
{ 
    <p>
        Email:
        @Html.TextBoxFor(x => x.Email)
    </p>
}

これですべての連絡先がレンダリングされますが、モデルにデータを投稿すると REQUIRED および VISIBLE ブール値のプロパティが false になります。これらは私が追加しなかったためです:

@Html.HiddenFor(x => x.FirstNameRequired)
@Html.HiddenFor(x => x.FirstNameVisible)

この検証を追加すると、うまく機能しています。ModelState.IsValid は正しく機能しています。問題は、誰かが非表示の値データを変更し、誤ったデータを挿入できるようになった場合です。どうすればこれを防ぐことができますか?

4

2 に答える 2

0

[RequiredIf(...)]プレーンに置き換えて[Required]削除し@Html.HiddenFor(...)ます。これにより、フィールドは常に必須になり、ユーザーは値を指定する必要があります。

エンティティを永続化する前に、さまざまに必要なフィールドを手動で検証する必要があります。

于 2012-11-16T00:03:56.397 に答える