1

ASP.NET MVC 3 と Entity Framework を使用して小さなアプリケーションを構築しています。

「最大参加者数」と「現在登録されている参加者」を持つ社交イベントを表すモデルがあります。イベントを編集する際、ユーザーはイベントの定員を変更できますが、定員を現在登録されている人数よりも少ない値に変更できないようにしたいです。

このロジックを Event モデルの Capacity プロパティのセッターに追加するだけでよいと単純に想定していましたが、このロジックは無視され、値はとにかく更新されているようです...

完全に更新されたモデルは次のとおりです。

public class SocialEvent : IValidatableObject
{
    public SocialEvent()
    {
        this.Users = new HashSet<Person>();
    }


    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime Date { get; set; }

    public int Capacity { get; set; }

    public int SlotsRemaining { get { return Capacity - Attending; } }
    public int Attending { get { return Users.Count; } }

    public virtual ICollection<Person> Users { get; set; }


    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (Capacity < Attending)
        {
            var campo = new[] { "Capacity" };
            yield return new ValidationResult("Capacity cannot be less than number of confirmed attendees.", campo);
        }
    }
}

これが私のコントローラーからのコードです。これはほとんど自動生成されたものであり、これが問題の場所であると推測しています:

    //
    // GET: /Event/Edit/5
    public ActionResult Edit(int id)
    {
        SocialEvent socialevent = db.SocialEvents.Find(id);
        return View(socialevent);
    }

    //
    // POST: /Event/Edit/5
    [HttpPost]
    public ActionResult Edit(SocialEvent socialevent)
    {
        if (ModelState.IsValid)
        {
            db.Entry(socialevent).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(socialevent);
    }

モデルの編集に使用されるフィールドを含むビューは次のとおりです。

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
    <legend>NadEvent</legend>

    @Html.HiddenFor(model => model.Id)


    <div class="editor-label">
        @Html.LabelFor(model => model.Capacity)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Capacity)
        @Html.ValidationMessageFor(model => model.Capacity)
    </div>

    <p>
        <input type="submit" value="Save" />
    </p>
</fieldset>
}

ユーザーが無効な番号を選択するのを防ぐために、容量を設定するときに独自のロジックを追加するにはどうすればよいですか? ありがとう。

4

1 に答える 1

0

いいえ、ルールを使用する場合、この仮定を行うことはできません。ModelStateルールはモデルで定義されたものに固有DataAnnotationsのものです。検証のタイプの場合、インターフェイスを実装してIValidatableObjectメソッドをオーバーライドする必要があるValidateため、カスタムのサーバー側検証を定義できます。実行する必要があります

例えば

public class SocialEvent : IValidatableObject
{
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if(Capacity < Attending)
        {
           var campo = new[] { "Capacity" }; 
           yield return new ValidationResult("Capacity cannot be less than number of confirmed attendees.", campo);  
        }
    }

}

たとえば、mvc で作業する場合"automatic"、この注釈を使用していくつかの検証を定義できます。

[Required] <--- this forces in the view to be a required field
public string email {get ; set;}

このリンクでは、モデルで使用できるすべての DataAnnotations を見つけることができます。 また、このリンクでは、このデータ注釈の例をいくつか見ることができます

最後の更新

デフォルトではAttending、ユーザーのICollectionは空であるため、フィールド値を入力していません.2番目にこれが機能する場合でも、最初はフィールドを非表示の値として追加することを検討する必要があります.ウィンドウをクリックすると、そのフィールドをシリアル化する必要があります.価値がある

出席フィールドを追加して編集ビューを変更しました

@Html.HiddenFor(model => model.Attending)

出席者の値で値を取得する方法がないため、 linqICollection<Uers>によって生成されたクエリとデータベースを確認し、適切に関連しているかどうかを確認します。

于 2013-03-11T17:24:42.393 に答える