私はMVC 4とASP.net全般に比較的慣れていません。いくつかのプロパティを持つ「部屋」を作成しようとしていますが、そのうちの 1 つは別のモデルに含まれるステータスのリストからクエリを実行します。クラスを次のように設定しています。
Room.cs
public class Room
{
[Key]
public Guid RoomId { get; set; }
[Required(ErrorMessage = "A Room Name is required")]
public string Name { get; set; }
public string Description { get; set; }
public virtual Status Status { get; set; }
[DisplayName("Created On")]
public DateTime? Created { get; set; }
[DisplayName("Last Modified")]
public DateTime? Modified { get; set; }
}
Status.cs
public class Status
{
[Key]
public int StatusId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
部屋に対する作成アクションにデフォルトの足場を使用すると、次のコードを使用して問題なく動作し、新しく作成された部屋に「新規」のステータスを適切に適用します。
// 投稿: /Room/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Room room)
{
if (ModelState.IsValid)
{
room.Created = DateTime.Now;
room.Status = db.Statuses.Single(s => s.Name == "New");
room.RoomId = Guid.NewGuid();
db.Rooms.Add(room);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(room);
}
私の場合、編集アクションで room.Status を割り当てるために同じ構文を試行すると、ステータスが自動的に「新規」から「検出」に変更されますが、データベースでステータス値が変更されることはありません。db.SaveChanges(); までローカルをトレースしています。room.Status の値が定義を新しいステータスに正確に反映していることがわかりますが、バックエンドでは単に更新されていません。これが私の更新コードです:
//部屋/編集/5
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Room room)
{
if (ModelState.IsValid)
{
room.Modified = DateTime.Now;
room.Status = db.Statuses.Single(s => s.Name == "Discovery");
db.Entry(room).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(room);
}
この値を変更する方法がわかりません。私の編集ビューは次のとおりです。
@model vwr.Cloud.Models.Room
@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Room - @Html.ValueFor(model => model.Name)</legend>
@Html.HiddenFor(model => model.RoomId)
@Html.HiddenFor(model => model.Name)
@Html.HiddenFor(model => model.Created)
@Html.HiddenFor(model => model.Status.StatusId)
<div class="editor-label">
Room Status - @Html.ValueFor(model => model.Status.Name)
</div>
<div class="editor-label">
Created Date - @Html.ValueFor(model => model.Created)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Description)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Description)
@Html.ValidationMessageFor(model => model.Description)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>