DropDownListFor不在BeginForm之外工作

时间:2014-05-15 21:41:35

标签: asp.net asp.net-mvc razor

我正在使用ASP.net MVC 3。

这是我的代码:

<tr class="print-hide" id="NewExpenseTypeRow">
    <td class="text">Add Expense Type</td>
    <td class="form-values">@Html.EditorFor(m => m.Description)</td>
    <td class="form-values">@Html.DropDownListFor(m => m.Category, Model.Categories.Select(c => new SelectListItem { Text = c }))</td>
    <td></td>
    <td>
        @using (Html.BeginForm("UpdateExpenseType", "Grants", FormMethod.Post, new { id = "UpdateExpenseType" }))
        {
            @Html.HiddenFor(m => m.Id)
            @Html.HiddenFor(m => m.Mode)
            @Html.HiddenFor(m => m.GrantId)

            <input type="submit" value="Save" data-values="#NewExpenseTypeRow .form-values input" />
        }
    </td>
</tr>

即使我使用class =&#34; form-values&#34;,DropDownListFor中的值也没有进入控制器。控制器只获取该字段的默认值。

如何将DropDownListFor值中的值输入控制器?

1 个答案:

答案 0 :(得分:1)

你不能没有javascript干预。标准HTML规则规定您要发布的任何内容都必须包含在<form>元素中。这只是简单的HTML发布101。

此外,class="form-values"与表单发布无关(除非您的javascript框架使用)。

所以,只需将你的BeginForm移动......

@using (Html.BeginForm("UpdateExpenseType", "Grants", FormMethod.Post, new { id = "UpdateExpenseType" })) {
<tr class="print-hide" id="NewExpenseTypeRow">
  <td class="text">Add Expense Type</td>
  <td class="form-values">@Html.EditorFor(m => m.Description)</td>
  <td class="form-values">@Html.DropDownListFor(m => m.Category, Model.Categories.Select(c => new SelectListItem { Text = c }))</td>
  <td></td>
  <td>
    @Html.HiddenFor(m => m.Id)
    @Html.HiddenFor(m => m.Mode)
    @Html.HiddenFor(m => m.GrantId)

    <input type="submit" value="Save" data-values="#NewExpenseTypeRow .form-values input" />
  </td>
</tr>
}

这是在没有javascript hacks的情况下执行此操作的基本方法。

如果你想变得讨厌,你可以使用Javascript挂钩到表单发布事件,在页面上捕获你想要的元素数据,将它添加到表单数据变量,并通过javascript提交它,最后重定向页面。

这比我上面刚刚建议的更加努力。

编辑:好的,我在你的提交按钮中看到了这个:

data-values="#NewExpenseTypeRow .form-values input"

你必须使用一些nuget package / javascript / jquery框架试图自动为你连接,类似于我上面的选项2,使用自定义javascript为你做这个。

唐&#39;吨。很可能是你正在使用的javascript中的一个错误(你不知道你正在使用它)无法识别这些字段。

再一次,不要这样做。我不知道你试图使用什么javascript,如果你想继续使用javascript,这是你的问题javascript / plugin / jquery的问题。

唐&#39;吨

1)摆脱data-values="#NewExpenseTypeRow .form-values input"

2)按照上面的步骤将@using (Html.BeginForm("UpdateEx...向上移动以包围整个表单。它不会伤害任何东西,<form>标签不用于样式。

少了我的朋友。

编辑2 - 我认为这就是你要找的......

数据值和表单ID的命名约定使我认为您正在使用某些模板或更大的解决方案。几乎就像有一些ajax在继续。

我认为你的问题在于你用来捕获输入字段的任何javascript代码。

请注意,@Html.DropDownListFor()会生成<select>,而不是<input>字段。那么您是否需要更改提交按钮上的data-values以捕获<select>以及<input>?像这样:

data-values="#NewExpenseTypeRow .form-values input,#NewExpenseTypeRow .form-values select"

我猜你正在使用的javascript框架使用这个data-values属性作为jquery选择器从中获取数据。其中,您可以将jquery选择器中的多个与逗号组合在一起。所以,这可能有用。

虽然不知道你用什么javascript来获取数据值属性以及它是如何被使用的,但这只是猜测。