C# 为什么我的PartialView呈现在表单标记之外?
我有一个视图,显示“房间”对象的HTML表。每个房间都是桌子上的一排(这是一个局部视图) 该视图包含以下代码:C# 为什么我的PartialView呈现在表单标记之外?,c#,asp.net-mvc,asp.net-mvc-5,C#,Asp.net Mvc,Asp.net Mvc 5,我有一个视图,显示“房间”对象的HTML表。每个房间都是桌子上的一排(这是一个局部视图) 该视图包含以下代码: <table> @foreach (var item in Model) { using (Html.BeginForm()) { @Html.Partial("_roomPartial", item) } } </table> _部分房间: @model P
<table>
@foreach (var item in Model)
{
using (Html.BeginForm())
{
@Html.Partial("_roomPartial", item)
}
}
</table>
_部分房间:
@model PatientAssigner.Models.Room
<tr>
<td>
@Html.DisplayFor(room => room.ID)
@Html.HiddenFor(room => room.ID)
</td>
<td>
@Html.EditorFor(room => room.isOccupied)
@Html.ValidationMessageFor(room => room.isOccupied)
</td>
<td>
@Html.DropDownListFor(room => room.patientComplexityLevel,
new SelectList(Enum.GetValues(typeof(PatientAssigner.Models.PatientComplexityLevel)),
Model.patientComplexityLevel),
"")
@Html.ValidationMessageFor(room => room.patientComplexityLevel)
</td>
<td>
<input type="submit" value="Save" class="btn btn-default" id="saveBtn" />
</td>
</tr>
@model patientasigner.Models.Room
@DisplayFor(room=>room.ID)
@Html.HiddenFor(room=>room.ID)
@EditorFor(room=>room.isocupied)
@Html.ValidationMessageFor(room=>room.isocupied)
@Html.DropDownListFor(room=>room.patientComplexityLevel,
新的SelectList(Enum.GetValues(typeof(PatientSigner.Models.PatientComplexityLevel)),
模型。患者复杂度等级),
"")
@Html.ValidationMessageFor(room=>room.patientComplexityLevel)
表单
标记在表
和tr
标记之间无效。我建议将您的视图更改为没有tr
或td
标记,并在外部执行此操作:
<table>
@foreach (var item in Model)
{
<tr><td>
@using (Html.BeginForm())
{
@Html.Partial("_roomPartial", item)
}
</td></tr>
}
</table>
您是否检查过表单标记是否可以是表或tr标记的子项?@lucuma Wow!没有。我会检查一下。我敢打赌它一定在
td
内。\u roomPartial
视图的内容是什么?它是否以
开头,以“?@lucuma Hmmm”结尾,表示表单标记可以位于任何接受流内容的元素中(并且
确实接受流内容)。小修复-我错过了一个@
好吧,我真的不能从部分中去掉
。或者至少,这看起来很奇怪。因为在部分中有无效的标记(有多个td)。这没关系,Razor不关心HTML标记。唯一的另一种方法是把BeginForm
放在你的partial中。好吧,我试了一下,但它并没有真正改变行为。如果我从片段中取出
和第一个
,并将它们移植到视图中,我只会得到一个额外的
标记,其中包含一个空表单(在呈现的HTML中)。我觉得非常愚蠢,但仔细观察,HTML实际上与我指定的一样。正是Chrome检查器在试图显示意外结构时弄得一团糟(因此它过早地“关闭”表单标记)。我在ViewPage Source中看到的是正确的(将整个tr包装在一个表单标记中),但检查器完全显示了其他内容(表单标记立即关闭,而tr标记随后开始)。
@model PatientAssigner.Models.Room
<tr>
<td>
@Html.DisplayFor(room => room.ID)
@Html.HiddenFor(room => room.ID)
</td>
<td>
@Html.EditorFor(room => room.isOccupied)
@Html.ValidationMessageFor(room => room.isOccupied)
</td>
<td>
@Html.DropDownListFor(room => room.patientComplexityLevel,
new SelectList(Enum.GetValues(typeof(PatientAssigner.Models.PatientComplexityLevel)),
Model.patientComplexityLevel),
"")
@Html.ValidationMessageFor(room => room.patientComplexityLevel)
</td>
<td>
<input type="submit" value="Save" class="btn btn-default" id="saveBtn" />
</td>
</tr>
<table>
@foreach (var item in Model)
{
<tr><td>
@using (Html.BeginForm())
{
@Html.Partial("_roomPartial", item)
}
</td></tr>
}
</table>
<table>
<tr>
<td>
<form>
<table>
<tr>
<td>cell1</td>
<td>cell2</td>
<td>cell3</td>
</tr>
</table>
</form>
</td>
</tr>
<tr>
<td>
<form>
<table>
<tr>
<td>cell1</td>
<td>cell2</td>
<td>cell3</td>
</tr>
</table>
</form>
</td>
</tr>
</table>