Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 链接到外键列的ASP.NETMVC4更新值_Asp.net Mvc_Razor_Foreign Keys - Fatal编程技术网

Asp.net mvc 链接到外键列的ASP.NETMVC4更新值

Asp.net mvc 链接到外键列的ASP.NETMVC4更新值,asp.net-mvc,razor,foreign-keys,Asp.net Mvc,Razor,Foreign Keys,一般来说,我对MVC4和ASP.net比较陌生。我正在尝试创建一个包含一些属性的“房间”,其中一个属性是从另一个模型中包含的状态列表中进行查询。我的课程设置如下: @model vwr.Cloud.Models.Room @{ ViewBag.Title = "Edit"; } <h2>Edit</h2> @using (Html.BeginForm()) { @Html.AntiForgeryToken() @Html.Validation

一般来说,我对MVC4和ASP.net比较陌生。我正在尝试创建一个包含一些属性的“房间”,其中一个属性是从另一个模型中包含的状态列表中进行查询。我的课程设置如下:

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

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; }
    }
当我对文件室使用默认的创建操作时,我使用的是以下代码,该代码工作正常,并正确地将“新建”状态应用于新创建的文件室

//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);
        }
当我尝试使用相同的语法在编辑操作上分配room.Status时,在我的情况下,自动将状态从“New”更改为“Discovery”,数据库中的状态值永远不会修改。我正在跟踪局部变量,直到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>
@model vwr.Cloud.Models.Room
@{
ViewBag.Title=“编辑”;
}
编辑
@使用(Html.BeginForm()){
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
Room-@Html.ValueFor(model=>model.Name)
@Html.HiddenFor(model=>model.RoomId)
@Html.HiddenFor(model=>model.Name)
@Html.HiddenFor(model=>model.Created)
@Html.HiddenFor(model=>model.Status.StatusId)
房间状态-@Html.ValueFor(model=>model.Status.Name)
创建日期-@Html.ValueFor(model=>model.Created)
@LabelFor(model=>model.Description)
@EditorFor(model=>model.Description)
@Html.ValidationMessageFor(model=>model.Description)

} @ActionLink(“返回列表”、“索引”)
我花了很长时间才弄明白这一点,但我还需要在我的Room类中添加一个映射到Navigation属性的[ForeignKey]条目。我不能说我还不明白它是如何工作的,可以说,它确实如此:-)

最后一个房间

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