ASP.Net MVC 4 Update value linked to a foreign key column

。_饼干妹妹 提交于 2019-12-08 07:52:31

问题


I'm relatively new to MVC 4 and ASP.net in general. I'm trying to create a "room" with some properties, one of which queries from a list of statuses contained in another model. I have my classes set up as follows:

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; }
    }

When I use the default scaffolding for the create action against the room, I am using the following code, which is working flawlessly, and properly applying the status of "New" to the newly created room.

// Post: /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);
        }

When I attempt the same syntax for assigning room.Status on an edit action, in my case, automatically changing the status from "New" to "Discovery", the status values are never modified in the database. I am tracing the locals right up to the db.SaveChanges(); call, and I can see that the room.Status value is accurately reflecting the definition to the new status, but it's simply not updating on the back end. Here is my update code:

//Room/Edit/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);
        }

I'm at a loss as to how to change this value! My Edit view is as follows:

@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>

回答1:


It took me WAY too long to figure this out, but I also needed to add a [ForeignKey] entry to my Room class that mapped to the Navigation Property. I can't say I yet understand HOW it works, suffice to say, it does :-).

Final 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; }
    }



回答2:


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


来源:https://stackoverflow.com/questions/18195947/asp-net-mvc-4-update-value-linked-to-a-foreign-key-column

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!