【问题标题】:C# MVC form doesn't work with input form attributeC# MVC 表单不适用于输入表单属性
【发布时间】:2018-03-26 07:35:00
【问题描述】:

我需要在表格单元格中使用表格,在另一个单元格中使用字段。我正在使用输入form attribute。 MVC 将数据传递给控制器​​工作正常,但表单发送之前的验证不适用于此属性。

<tr>
<td>
    @Html.EditorFor(model => item.Code, new { htmlAttributes = new { @class = "form-control inline-edit", form = "editForm" + item.Id } })
    @Html.ValidationMessageFor(model => item.Code)
</td>
<td>
    @Html.EditorFor(model => item.Name, new { htmlAttributes = new { @class = "form-control inline-edit", form = "editForm" + item.Id } })
    @Html.ValidationMessageFor(model => item.Name)
</td>
<td class="text-right">
    @using (Html.BeginForm("UpdatePrintMaterial", "Production", FormMethod.Post, new { id = "editForm" + item.Id }))
    {
        @Html.AntiForgeryToken()
        @Html.HiddenFor(model => item.Id)
        <button class="btn btn-default save" data-toggle="tooltip" title="Zapisz"><i class="fa fa-save"></i></button>
    }
</td></tr>

如何解决此问题以在发送数据之前使用验证?

【问题讨论】:

  • 简短回答是否定的。 MVC 的客户端验证(使用jquery.validate.unobtrusive.jsjquery.validate.js 仅适用于&lt;form&gt; 元素内的表单控件。最好使用布局元素(定位、浮动等)来模拟表格,而不是&lt;table&gt;元素。
  • 但是,拥有多个表单(每行一个)是没有意义的 - 您一次只能提交一个表单。如果您希望能够对多行进行编辑,则使用单个表单并使用for 循环或EditorTemplate 正确生成视图 - 目前您的代码甚至无法正常工作,因为您的名称属性与您的模型不匹配) - 参考this answer
  • 或者,在每一行中都有一个编辑链接,并显示一个用于编辑行的对话框。

标签: asp.net-mvc forms validation razor attributes


【解决方案1】:

修订:根据您的要求,

您可以有 3 个单独的表单标签,每个按钮一个。只需确保您在表单中有一个输入字段,用于您要传递的数据。例如,如果您的操作方法接受 EmployeeId 并带有一个名为 EmployeeId 的参数,那么您应该在表单内具有相同的输入隐藏字段。

@model IEnumerable<Employee>
<table>
@foreach(var item in Model)
{
<tr>
   <td>@item.EmployeeName</td>
   <td>@item.EmployeeGender</td>
   <td>@item.EmployeeCity</td>
   <td>@item.EmployeeDateOfBirth</td>
   <td>
     @using(Html.BeginForm("Details","YourControllerName"))
     {
       <input type="hidden" name="EmployeeId" value="@item.EmployeeId" />
       <input type="submit" value="Details" />
     }
     @using(Html.BeginForm("Edit","YourControllerName"))
     {
       <input type="hidden" name="EmployeeId" value="@item.EmployeeId" />
       <input type="submit" value="Edit" />
     }
     @using(Html.BeginForm("Delete","YourControllerName"))
     {
       <input type="hidden" name="EmployeeId" value="@item.EmployeeId" />
       <input type="submit" value="Delete" />
     }
   </td>
   </tr>
   }

* 还要记住,嵌套表单是无效的 HTML。所以请确保您没有这些。

【讨论】:

  • 感谢您的帖子,但您在我的代码中错了,没有嵌套表单。只有一个表单具有 UpdatePrintMaterial 操作。
  • 如果您的问题已解决,请标记为解决方案或投票。谢谢。
猜你喜欢
  • 2023-03-28
  • 2011-05-22
  • 2019-07-16
  • 2013-07-18
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多