1

エンティティの例があるとします。

public class City
{
    public int CityId { get; set; }
    public string Name { get; set; }

    public int StateId { get; set; }
    public virtual State State{ get; set; }
}

新しい都市が作成される状況がいくつかあります。1) ビュー内のユーザーによって、既存の状態から選択:

@Html.DropDownListFor(it => it.StateId, ViewBag.States)

2) 状態が新しい可能性がある状況でのバックエンド:

State newState = context.States.Create();
newState.Name = "North Takoma";

City newCity = context.Cities.Create();
newCity.Name = "Springfield";
newCity.State = newState;

context.States.Attach(newState);
context.Cities.Attach(newCity);    

context.SaveChanges();

状態の関係は必須であり、検証する必要があります。問題は、StateID または実際の State リレーションシップ オブジェクトで検証する必要があるかどうかです。(ここでは FluentValidation を使用していますが、データ注釈を使用した場合とかなり似た状況になります)

public class CityValidator : AbstractValidator<City>
{
    public CityValidator()
    {
        // this?
        RuleFor(it => it.StateID).NotEmpty();

        // or this?
        RuleFor(it => it.State).NotNull();
    }
}

最初の状況では、StateID は取り込まれますが、状態オブジェクトは取り込まれません。2 番目の状況ではその逆です。

バリデーターにカスタム ロジックを配置して、どちらかをチェックすることができます。ただし、ビューで目立たない検証属性が失われます。この問題に対する適切な DRY ソリューションはありますか?

明確化のために編集:この例では、StateID (既存の州の場合) または State プロパティ (新しい州の場合) を設定することで、State を City に割り当てることができます。では、どうすれば検証を設定し、ビューの入力で「data-val-required」属性を取得できますか?

4

1 に答える 1

1

私が正しく理解している場合、ユーザーは州を選択する場合と選択しない場合がありますか? 私は正しいですか?

あなたのための、

最初のケース: StateID は入力されますが、状態オブジェクトは入力されません。

RuleFor(c => c.StateId).NotEmpty().When(s => s.State != null).WithMessage("Please select state.");

2 番目のケース: 2 番目の状況ではその逆

これはサーバー側で発生することを理解しているので、このためのルールは必要ありません。

お役に立てれば。

于 2012-11-09T18:32:35.350 に答える