【发布时间】:2016-10-12 14:15:57
【问题描述】:
我是 MVC5 的新手。我想将建筑细节添加到数据库中。建筑物详细信息包括名称、房间详细信息列表等。用户可以添加建筑物详细信息,例如名称、房间详细信息列表。添加所有详细信息后,房间和建筑物的详细信息列表将保存到数据库中。
我有如下视图模型的表单
BuildingViewModel.cs
public class Building
{
public Building()
{
Rooms = new List<Room>();
NewRoom = new Room();
}
[Required]
public string Name { get; set; }
public List<Room> Rooms { get; set; }
public Room NewRoom { get; set; }
public string Button { get; set; }
}
public class Room
{
[Required]
public string RoomName { get; set; }
public string Area { get; set; }
}
这是我的视图 Create.cshtml
@model Building
@{
ViewBag.Title = "Create";
}
@using (Html.BeginForm())
{
<h2>Create</h2>
<h3>Building</h3>
@Html.LabelFor(t => t.Name)
@Html.TextBoxFor(t => t.Name)
@Html.ValidationMessageFor(t => t.Name)
<br />
<br />
<fieldset>
<legend>Room</legend>
<div class="editor-label">
@Html.LabelFor(model => model.NewRoom.RoomName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.NewRoom.RoomName)
@Html.ValidationMessageFor(model => model.NewRoom.RoomName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.NewRoom.Area)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.NewRoom.Area)
@Html.ValidationMessageFor(model => model.NewRoom.Area)
</div>
<p>
<input type="submit" name="button" value="Add Room" />
</p>
</fieldset>
<br />
<table border="1" cellpadding="5px" cellspacing="0">
<thead>
<tr>
<th>#</th>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
@for (int i = 0; i < Model.Rooms.Count(); i++)
{
var room = Model.Rooms[i];
<tr>
<td>@(i + 1)</td>
<td>@room.RoomName @Html.HiddenFor(t => room.RoomName)</td>
<td>@room.Area @Html.HiddenFor(t => room.Area)</td>
</tr>
}
</tbody>
</table>
<br />
<input type="submit" name="button" value="Create" />
}
<script src="~/Scripts/jquery-1.8.0.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
这是我的控制器 BuildingController.cs
public class BuildingController : Controller
{
[HttpGet]
public ActionResult Create()
{
var building = new Building();
return View(building);
}
[HttpPost]
public ActionResult Create(Building building)
{
switch (building.Button)
{
case "Add Room":
if (ModelState.IsValid)
{
building.Rooms.Add(building.NewRoom);
building.NewRoom = new Room();
return View(building);
}
break;
case "Create":
if (ModelState.IsValid)
{
// TODO: save to db
return View();
}
break;
}
return View(building);
}
}
我的问题是,当单击“添加房间”按钮时,它会在建筑物的名称属性中引发验证错误。我想要的是,仅在单击“添加房间”按钮时显示对房间类属性的验证,并在单击“创建”按钮时显示建筑属性的验证错误。
Add Building Validation Error Image
我为这个问题花费了超过 2 周的时间。请帮帮我...
感谢您宝贵的时间。
【问题讨论】:
-
您采用了错误的方法,并且这些代码都没有任何意义(并且您的
@for (int i = 0; i < Model.Rooms.Count(); i++)循环中的代码正在生成与您的模型无关且不会绑定到任何东西的name属性. 您可以通过在一个操作中编辑Building及其Room集合来处理此问题(请参阅this answer),这允许您动态添加新的集合项。 -
或者您以一种形式创建建筑物,一旦创建,您就重定向到视图以创建其房间。但是,您为什么要创建与相关建筑物没有关系的
Room对象尚不清楚。你Room类需要Building的导航属性,否则数据毫无意义
标签: c# asp.net-mvc validation razor