回发时,asp net MVC3提交对象列表为null

时间:2012-11-11 01:38:35

标签: c# asp.net-mvc-3 list null

我使用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>
}

提前致谢。

凯雷姆

5 个答案:

答案 0 :(得分:1)

我会使用编辑模板来处理此问题。让您的View模型像这样表示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。转到Views/YourControllerName和Crete一个名为 EditorTemplate 的文件夹,然后使用与属性名称(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" />
}

现在,当您发布表单时,您的模型将具有ReportedUsers集合,其中所选复选框将具有IsSelected属性的True值。

[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);
}

答案 1 :(得分:0)

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

改为做这个小技巧:

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

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

这应该有效。

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

答案 2 :(得分:0)

我参加派对有点晚了,但如果你把它嵌入模型中就很容易引用这个列表 -

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

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

答案 3 :(得分:0)

@ Html.CheckBox(“[”+ i +“]。”+“IsReported”,Model [i] .IsReported.Value); 对我来说很完美。

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

在我的情况下,我有一个包含列表对象的视图模型(模型)。 如果您在post方法中指定视图模型,那么您将获得列表的空值(此处模型对象为null)。但是,如果在操作中添加特定列表参数(configurationList),则可以获取控制器中的所有列表值。

答案 4 :(得分:0)

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

当我从数据库中获取复选框时,我意识到复选框有三个值(true / false / null),因为当我设置数据库时,我让复选框值为nullable。我重新设计了数据库,问题解决了。

你没有发布模型,所以我不确定是否是这种情况。只要看一下模型,如果它在你的Ischeck属性上写Nullable,就去数据库并重新设计。记住isCheck,isSelected属性必须只有两个值(true / false)。