为什么我的PartialView在表单标签之外呈现

本文关键字:标签 表单 我的 PartialView 为什么 | 更新日期: 2023-09-27 18:13:43

我有一个显示"Room"对象的HTML表的视图。每个Room是表中的一行(这是一个PartialView)。

视图包含以下代码:

<table>
    @foreach (var item in Model) 
    {
        using (Html.BeginForm())
        {
            @Html.Partial("_roomPartial", item)
        }
    }
</table>

Model是一个IEnumerable<Room>,而_roomPartial是一个包含房间属性的HTML行。

由于某些原因,Partial的HTML呈现在关闭表单标记之后(尽管在using块中):

<form action="/Room/Index" method="post"></form>
<tr>
    ...some boring markup...
</tr>

我试图使这个工作:

  • Html.RenderPartial("_roomPartial", item);代替@Html.Partial
  • using (Html.BeginForm())块移动到PartialView

每次都得到相同的HTML结果。

为什么局部呈现在表单标签之外?我怎样才能使它正确渲染呢?


视图:

@model IEnumerable<PatientAssigner.Models.Room>
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Index</h2>

<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.ID)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.isOccupied)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.patientComplexityLevel)
        </th>
        <th></th>
    </tr>
@foreach (var item in Model) 
{
    using (Html.BeginForm())
    {
        @Html.Partial("_roomPartial", item)
    }
}
</table>

_roomPartial:

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

为什么我的PartialView在表单标签之外呈现

form标签在tabletr标签之间无效。我建议改变你的观点,不要有trtd标签,并在外面这样做:

<table>
    @foreach (var item in Model) 
    {
        <tr><td>
        @using (Html.BeginForm())
        {
            @Html.Partial("_roomPartial", item)
        }
        </td></tr>
    }
</table>

如果您需要为每一行设置一个form,但希望您的input分布在单元格中,您唯一的选择是像这样嵌套表:

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