2

我在我的项目之一中使用 asp net MVC 3。我使用部分视图进行编码。我想在列表中列出所有客户并将他们的信息作为列表提交。当我尝试在回传中提交我的列表时,它发送我的列表为空。您可以在下面找到我的代码:

我的控制器方法是:

[HttpPost]
    public ActionResult ConfirmUsers(ICollection<Career.DomainModel.UserApprovalDto> collection)
    {
        string bas = "";
        //if (collection != null)

        if (ModelState.IsValid)
        {
            bas = "bas";
        }

        return RedirectToAction("Index");
    }

我的部分观点是:

@model List<Career.DomainModel.UserApprovalDto>
@using (Html.BeginForm("ConfirmUsers", "ManageUsers", new { area = "" }, FormMethod.Post))
{
    <table>
        <tr>
            <th>
                Name
            </th>
            <th>
                Is Reported
            </th>
        </tr>
        @for (int i = 0; i < Model.Count(); i++)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => Model[i].FirstName)
                </td>
                <td>
                    @Html.CheckBox("IsReported", Model[i].IsReported.HasValue ? Model[i].IsReported.Value : false)
                    @*@Html.CheckBoxFor(modelItem => Model[i].IsReported.Value);*@ @*    @if (Model[i].IsReported != null)
                    {
                        @Html.CheckBoxFor(modelItem => Model[i].IsReported.Value);
                    }
                    else
                    {
                        @Html.CheckBoxFor(modelItem => Model[i].IsReported.Value);
                    }*@
                </td>
                <td>
                </td>
            </tr>
        }
    </table>
    <div>
        <input name="submitUsers" type="submit" value="Save" />
    </div>
}

提前致谢。

凯雷姆

4

5 回答 5

1

我会使用编辑器模板来处理这个问题。让您的 View Model 像这样来表示 CheckBox 项。

public class ReportedUserViewModel 
{
  public string FirstName { set;get;}
  public int Id { set;get;}
  public bool IsSelected { set;get;}
}

现在在你的主视图模型中,添加一个属性,它是上述类的集合

public class ConfirmUserViewModel
{      
  public List<ReportedUserViewModel> ReportedUsers{ get; set; }      
  //Other Properties also here

  public ConfirmUserViewModel()
  {
    ReportedUsers=new List<ReportedUserViewModel>();       
  }    
}

现在在您的GET操作中,您将填充 ViewModel 的值并将其发送到视图。

public ActionResult ConfirmUser()
{
    var vm = new ConfirmUserViewModel();

    //The below code is hardcoded for demo. you mat replace with DB data.
    vm.ReportedUsers.Add(new ReportedUserViewModel { Name = "Test1" , Id=1});
    vm.ReportedUsers.Add(new ReportedUserViewModel { Name = "Test2", Id=2 });

    return View(vm);
}

现在让我们创建一个 EditorTemplate。转到并创建一个名为EditorTemplateViews/YourControllerName的文件夹,并在那里创建一个与 Property Name( )同名的新视图ReportedUsers.cshtml

将此代码添加到新创建的编辑器模板中。

@model ReportedUserViewModel 
<p>
  <b>@Model.FirstName </b>   :
  @Html.CheckBoxFor(x => x.IsSelected) <br />
  @Html.HiddenFor(x=>x.Id)
</p>

EditorFor现在在您的主视图中,使用Html Helper 方法调用您的编辑器模板。

@model ConfirmUserViewModel
@using (Html.BeginForm())
{
    <div>  
      @Html.EditorFor(m=>m.ReportedUsers)         
    </div>    
    <input type="submit" value="Submit" />
}

现在,当您发布表单时,您的模型将拥有Collection,其中 Selected Check 框的属性ReportedUsers值为 True 。IsSelected

[HttpPost]
public ActionResult AddAlert(ConfirmUserViewModel model)
{
   if(ModelState.IsValid)
   {
      //Check for model.ReportedUsers collection and Each items
      //  IsSelected property value.
      //Save and Redirect(PRG pattern)
   }
   return View(model);
}
于 2012-11-11T01:58:05.727 回答
0

使用您编写的代码,MVC 模型绑定器机制不知道如何将这些输入映射到对象列表中。

改用这个小技巧:

@Html.CheckBox("[" + i + "]." + "IsReported", Model[i].IsReported.Value);

这将导致输入字段的名称为 [0].IsReported 用于列表中的第一项,[1].IsReported 用于下一项。

那应该行得通。

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

于 2012-11-11T16:49:55.737 回答
0

我参加聚会有点晚了,但是如果您将其嵌入模型中,只需参考该列表就很容易了-

@Html.CheckBoxFor(modelItem => Model.List[i].Selected)

这将为迭代器中的每个项目回发。

于 2013-11-08T21:29:52.037 回答
0

我上周遇到了同样的问题。

当我从数据库中获取复选框时,我意识到复选框具有三个值(真/假/空),因为我在设计数据库时让复选框值可以为空。我重新设计了数据库,问题就解决了。

您没有发布模型,所以我不确定是否是这种情况。只需查看模型,如果它在 Ischeck 属性上方写入 Nullable,请转到数据库并重新设计。记住 isCheck,isSelected 属性必须只有两个值(真/假)。

于 2016-04-03T17:26:47.910 回答
0

@Html.CheckBox("[" + i + "]." + "IsReported", Model[i].IsReported.Value); 非常适合我。

确保您的 post 方法包含列表的参数。例如 public ActionResult Index(ConfigViewModel model, List configurationList)

在我的例子中,我有一个包含列表对象的视图模型(模型)。如果您在 post 方法中按原样指定视图模型,那么您将获得列表的空值(这里模型对象为空)。但是,如果您在操作中添加特定的列表参数(configurationList),那么您可以获得控制器中的所有列表值。

于 2016-02-18T17:57:26.820 回答