Asp.net mvc 链接到外键列的ASP.NETMVC4更新值
一般来说,我对MVC4和ASP.net比较陌生。我正在尝试创建一个包含一些属性的“房间”,其中一个属性是从另一个模型中包含的状态列表中进行查询。我的课程设置如下: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
@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; }
}