【问题标题】:Html.BeginForm not returning values to controllerHtml.BeginForm 不向控制器返回值
【发布时间】:2015-05-21 04:24:32
【问题描述】:

为什么这会返回 null 给控制器?复选框项目正在显示,但是当我选择要保存的项目时,控制器操作中的项目为空。

在视图中

@model List<SearchOptionsViewModel>  
@using (Html.BeginForm("Save","Query", FormMethod.Post))
{ 
    @Html.AntiForgeryToken()
    <li id="li_15">
        <div>
            <p class="padding" />
             @foreach (var item in Model)
             {
                 <div>
                     @Html.CheckBoxFor(x => item.Selected)
                     @Html.HiddenFor(x => item.Value)
                     @Html.DisplayFor(x => item.Text)
                 </div>
             }
         </div>
     </li>
     <p>
         <input type="submit" value="Save" />
     </p>
}

动作

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Save(List<SearchOptionsViewModel> param)
{
    foreach (var item in param)
    {
      // Do stuff
    }
}

查看模型

public class SearchOptionsViewModel
{
    public string Text { get; set; }
    public string Value { get; set; }
    public bool Selected { get; set; }
}

【问题讨论】:

  • 您的操作与控制器中的内容不匹配 @using (Html.BeginForm("Save","ControllerName", FormMethod.Post))
  • 在表格中你提到actionnameSearch 在控制器中你的actionnameSave.. 怎么会??
  • 打错字了,抱歉。
  • 因为您需要使用for 循环或自定义EditorTemplate for typeof SearchOptionsViewModel,而不是foreach 循环。详情请参考this answer
  • 我建议 2 件事来帮助您解决此问题,您可以单独或一起做。 (1) 使用 fiddler 并查看 Form Post 的正文以查看正在传递的内容。 (2) 将 (HttpPost) Save Action 的参数切换到 FormCollection 并调查发送到服务器的内容。 -- 我的猜测是生成的表单控件上的名称属性是问题

标签: c# razor asp.net-mvc-5


【解决方案1】:

您需要为 HTML Helper 提供一个数字索引器(来自 for 循环)。如果您使用foreach,您将无法理解。这是因为您希望 HTML Helpers 以 foo[1].Value 的形式呈现,以便模型解析器可以正确地将 POSTed HTML 表单字段值转换为您的强类型集合(即您的 ViewModel):

@for( int i = 0; i < this.Model.Count; i++ )
{
    <div>
    @Html.CheckBoxFor( m => m[i].Selected)
    @Html.HiddenFor( m => m[i].Value)
    @Html.DisplayFor( m => m[i].Text)
    </div>
}

【讨论】:

    猜你喜欢
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    相关资源
    最近更新 更多