C# 为什么我的PartialView呈现在表单标记之外?

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

我有一个视图,显示“房间”对象的HTML表。每个房间都是桌子上的一排(这是一个局部视图)

该视图包含以下代码:

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