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