ASP.NET MVC 3:编辑项目的“集合”

时间:2012-02-02 09:29:33

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

我正在编辑一个自定义对象,它有一个字典Dictionary<MyOtherObject,Boolean>

public class MyObject{
   public int SomeProperties{get;set;}
   public int SomeMoreProperties{get;set;}
   ....
   public Dictionary<MyOtherObject, Boolean> Attributions{get;set;}
}

目标是我可以为字典中的每个项目设置一个复选框列表,并决定是否检查它。

我已经尝试为我的“Attribution”属性制作和编辑模板。考虑到已选择的值,它会完美显示。但是当我提交时,我收到字典的空值。

那么做到这一点的好方法是什么?

我发现这个stack overflow post有几乎相同的问题,而不是我有一个字典而不是简单的属性。 MVC如何处理它们?

我可以转换我的数据,但我没有办法找不到元素的“列表”。还找到this但没有答案

修改 我的同事确实做了一些尝试,开始只显示一个bool列表而不是一个对象列表: 使用对象

public class TheViewObject{
   //other fields
   List<bool> MyList{get;set;}
}

在视图中,如果我们使用@Html.EditorFor(m=>m.MyList)生成表单,我们就会得到:

<input checked="checked" class="check-box" data-val="true" data-val-required="The Boolean field is required." id="MyList_0_" name="MyList[0]" value="true" type="checkbox">
<input class="check-box" data-val="true" data-val-required="The Boolean field is required." id="MyList_1_" name="MyList[1]" value="true" type="checkbox">
<input checked="checked" class="check-box" data-val="true" data-val-required="The Boolean field is required." id="MyList_2_" name="MyList[2]" value="true" type="checkbox">
<input name="MyList[0]" value="false" type="hidden"><input name="MyList[1]" value="false" type="hidden"><input name="MyList[2]" value="false" type="hidden">

它有效,因为它直接知道如何处理List<bool>。此代码有效,我们会在表单返回时收到正确的数据。

现在,如果我们有一个模板

@model List<bool> 

@for (int i = 0; i < Model.Count; i++) { 
  @Html.EditorFor(x => Model[i]) 
} 

结果:

<input checked="checked" class="check-box" data-val="true" data-val-required="The Boolean field is required." id="MyList__0_" name="MyList.[0]" value="true" type="checkbox">
<input name="MyList.[0]" value="false" type="hidden">
<input class="check-box" data-val="true" data-val-required="The Boolean field is required." id="MyList__1_" name="MyList.[1]" value="true" type="checkbox">
<input name="MyList.[1]" value="false" type="hidden">
<input checked="checked" class="check-box" data-val="true" data-val-required="The Boolean field is required." id="MyList__2_" name="MyList.[2]" value="true" type="checkbox">
<input name="MyList.[2]" value="false" type="hidden"> </td> 

结果基本相同,除了我们还有一个“。”在MyList和[x]之间。使用这个synthax,模型绑定器无法弄清楚如何绑定对象。

我认为这基本上是我们之前的词典发生的事情(我们已经用列表测试了,同样的问题)

(我目前正在测试Steve Sanderson's begincollectionitem

4 个答案:

答案 0 :(得分:2)

This link should help you。一个老人,但一个礼物。

我在viewmodel中没有Dictionary。你是对的,它应该是某种列表。你可以使用数组,列表,集合,ienumerable等等。

public MyOtherMetaObject[] Attributions { get; set; }

MyOtherMetaObject还应包含您需要的bool值。它就像一个“蛮力”字典。

然后,您可以按照Haack博客中的指南来确保输入元素的名称正确。我们使用HtmlHelper by Steve Sanderson for this, @Html.BeginCollectionItem

答案 1 :(得分:1)

有时MVC无法自动猜测如何将表单数据映射到正确的模型。如果是这种情况你应该确保它不是你的错:)你应该仔细检查是否有一种方法可以自动完成。如果映射器确实很难解决问题,您可以生成ModelBinder

在你的控制器中你有这个:

[HttpPost]
public ActionResult Method([ModelBinder(typeof(YourModelBinder))]YourModel model)
{
}

然后创建一个类YourModelBinder

public class YourModelBinder : DefaultModelBinder
{
  public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
  {
    YourModel result = base.BindModel(controllerContext, bindingContext) as YourModel;

    // here you read all the form keys/values and stuff and build up your model

    return result;
  }
}

但是我不确定如何将此映射到您的MyObject内容,因为我不知道您的模型等等。

答案 2 :(得分:0)

嗨,我知道这个问题有点老了,但这可能对某人有所帮助。如果你想要一个MVC3教程来渲染和回发一组复选框值作为视图模型对象的一部分并将它们保存到数据库中,那么看看我对这个问题的回答:

Saving many to many relationship data in MVC Create view

详细介绍了如何首先使用Entity Framework代码设置数据上下文,以及首先渲染的模型,视图模型,Razor代码和控制器操作,然后将发布的数据保存到数据库。

答案 3 :(得分:0)

我最近写了一篇关于如何为具有可排序子集合的实体实现编辑表单的文章。本文中的代码使用异步请求将其他项添加到集合和JQuery UI以对项进行排序:

http://blog.rsuter.com/asp-net-mvc-how-to-implement-an-edit-form-for-an-entity-with-a-sortable-child-collection/