1

私は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>
4

2 に答える 2

0

これを理解するのに非常に時間がかかりましたが、[ForeignKey] エントリを Room クラスに追加して、Navigation プロパティにマッピングする必要がありました。私はまだそれがどのように機能するかを理解しているとは言えません。

最終的な 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; }

        [ForeignKey("Status")]
        public virtual int StatusId { get; set; }

        public virtual Status Status { get; set; }
        [DisplayName("Created On")]
        public DateTime? Created { get; set; }
        [DisplayName("Last Modified")]
        public DateTime? Modified { get; set; }
    }
于 2013-08-13T16:03:50.617 に答える
0
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; }

    [ForeignKey("Status")]
    public virtual int StatusId { get; set; }

    public virtual Status Status { get; set; }
    [DisplayName("Created On")]
    public DateTime? Created { get; set; }
    [DisplayName("Last Modified")]
    public DateTime? Mod
于 2013-12-20T09:29:20.160 に答える