我在使用多个表单创建视图时遇到问题,在同一个视图中我可以获取数据视图的操作和数据收集的后期操作。
以下是我的主要观点:
@model Models.BuildingNewBuildingViewModel
@{
ViewBag.Title = "Index";
}
@if (TempData["Added"] != null)
{
<div class="alert alert-success alert-dismissible fade in" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
@TempData["Added"]
</div>
}
@if (TempData["AddError"] != null)
{
<div class="alert alert-danger alert-dismissible fade in" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
@TempData["AddError"]
</div>
}
<h1>Svěřené budovy pro: @ViewBag.Name</h1>
<table class="table-bordered table-responsive table table-condensed">
<thead>
<tr>
<th>Id budovy</th>
<th>Podlaží</th>
<th>Použití</th>
<th>Výměra</th>
<th>Datum</th>
<th>Administrace</th>
</tr>
</thead>
<tbody>
@for (int i = 0; i < Model.NewBuildingViewModels.Count; i++)
{
using (Html.BeginForm("Index", "Home", FormMethod.Post, new { @class = "form-horizontal", id = "Form" }))
{
Html.RenderPartial("IndexPartial", Model.NewBuildingViewModels[i]);
}
}
</tbody>
</table>
&#13;
这是表格:
@model Models.NewBuildingViewModel
@Html.HiddenFor(x => x.Building, Model.Building)
<tr>
<td><a href="@Url.Action("SetMarks", "Home", new {id = Model.Id})">@Model.Building</a></td>
<td>
@if (Model.Floor > 0)
{
@Model.Floor
@Html.HiddenFor(x => x.Floor)
}
else
{
@Html.TextBoxFor(x => x.Floor, new {@Value = ""})
@Html.ValidationMessageFor(x => x.Floor)
}
</td>
<td>
@if (Model.Usage != null)
{
@Model.Usage
@Html.HiddenFor(x => x.Usage)
}
else
{
@Html.TextBoxFor(x => x.Usage)
@Html.ValidationMessageFor(x => x.Usage)
}
</td>
<td>
@if (Model.Size > 0)
{
@Model.Size
@Html.HiddenFor(x => x.Size)
}
else
{
@Html.TextBoxFor(x => x.Size, new {@Value = ""})
@Html.ValidationMessageFor(x => x.Size)
}
</td>
<td>
@if (Model.Date != DateTime.MinValue)
{
@Model.Date.Date
@Html.HiddenFor(x => x.Date)
}
else
{
@Html.TextBoxFor(x => x.Date)
@Html.ValidationMessageFor(x => x.Date)
}
</td>
<td>
@if (!Model.NewBuildingDataInDatabase)
{
<button type="submit">Odeslat</button>
}
else
{
if (Model.MarksInDatabase)
{
<i class="fa fa-check checkIcon" aria-hidden="true"></i>
}
else
{
<a href="@Url.Action("SetMarks", "Home", new {id = Model.Id})">Zadat Hodnocení</a>
}
}
</td>
</tr>
}
&#13;
我的问题是当我向控制器发送无效数据时。验证消息显示所有表单。我想查看所有表单,但仅查看已发送数据的表单的验证消息。
这是我的行动:
[HttpPost]
public ActionResult Index(NewBuildingViewModel buildingNewBuildingViewModel)
{
BuildingForIcoCommand buildingForIcoCommand = new BuildingForIcoCommand();
var buildingsForIco = buildingForIcoCommand.GetBuildingListForIco(AppContext);
if (ModelState.IsValid)
{
ViewBag.Name = User.Identity.Name;
ViewModelBuilder viewModelBuilder = new ViewModelBuilder();
DaoBase<NewBuilding, int> daoBase = new DaoBase<NewBuilding, int>(AppContext.NhSession);
daoBase.Save(viewModelBuilder.CreateNewBuilding(buildingNewBuildingViewModel));
return View(buildingForIcoCommand.GetBuildingListForIco(AppContext));
}
return View("Index",buildingsForIco);
}
答案 0 :(得分:0)
您的所有表单字段都将具有name和id属性,因为您在部分字段中呈现它们。这就是为什么它们都被标记为无效。
任何好的解决方案都可能涉及ajax。
解决此问题的一种方法是使用单个编辑表单。每个呈现的项目都有一个编辑按钮,单击此按钮将通过javascript使用项目的数据填充表单。这可能是模态或类似的。这种方法适用于jQuery / unobtrusive验证。
另一种方法是从控制器返回自定义响应,例如状态400和从模型状态派生的无效字段。然后,您可以在右侧字段中显示合适的错误消息。