张贴后,ASP NET MVC3提交对象列表为null



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

我的控制器方法是:

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

预先感谢。

kerem

我将使用编辑器模板处理此操作。拥有这样的视图模型来表示复选框项目。

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

现在在Yout Main View模型中,添加一个属性,该属性是上述类的集合

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,然后将一个称为 EditorteMplate 的文件夹转换,并在其中创建一个与属性名称相同名称(ReportedUsers.cshtml

的新视图

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

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

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

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

现在发布表单时,您的模型将具有ReportedUsers集合,其中选定的复选框将具有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);
}

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

而是做这个小技巧:

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

这将导致输入字段的名称为[0]。列表中的第一个项目,[1]。

应该有效的。

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

我在聚会上有点晚了,但是如果将其嵌入模型 -

,则很容易参考列表
@Html.CheckBoxFor(modelItem => Model.List[i].Selected)

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

@html.checkbox(" [" i "]。" " isReported",model [i] .isreported.value);为我工作得很完美。

确保您的发布方法包含列表的参数。例如,公共ActionResult索引(ConfigViewModel模型,列表ConfigurationList)

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

我上周遇到了同一问题。

我意识到,当我从数据库中获取它时,复选框具有三个值(true/fals/fals/null),因为当我删除数据库时,复选框值可nullull。我对DB进行了重新调整,并解决了问题。

您没有发布模型,所以我不确定是否是这种情况。只需查看该模型,如果在Ischeck属性上方编写无效,请转到数据库并重新设计。请记住Ischeck,Isseleal的属性只有两个值(true/false)。

相关内容

  • 没有找到相关文章

最新更新