2012-02-02 105 views
1

我目前正在编辑一个自定义对象,它有一个词典Dictionary<MyOtherObject,Boolean>ASP.NET MVC 3:编辑项目的“集合”

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

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

我试着为我的“归因”属性制作和编辑模板。它显示完美,考虑哪些值已被选中。但是,当我提交时,我收到字典的空。

那么这样做的好方法是什么?

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

我可以转换我的数据,但我没有看到一种方法没有元素的“列表”。同时还发现this,但没有答案

编辑 我的同事也做了一些尝试,开始只显示一个布尔值,而不是对象的列表的列表:与对象

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]之间。有了这个合成器,模型绑定器无法弄清楚如何绑定对象。

我认为这基本上是什么也与我们的字典发生之前

(我目前正在测试Steve Sanderson's begincollectionitem)(我们已经有一个列表,而不是,同样的问题测试)

回答

2

This link should help you。老人,但一个好东西。

我不会有字典的视图模型。你是对的,但它应该是某种列表。你可以使用数组,列表,集合,ienumerable等等。

public MyOtherMetaObject[] Attributions { get; set; } 

MyOtherMetaObject还应该包含你所需要的布尔值。这就像一本“蛮力”字典。

然后,您可以按照哈克的博客指导,以确保输入元件被正确地命名。我们使用HtmlHelper by Steve Sanderson for this, @Html.BeginCollectionItem

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的东西,因为我有不知道你的模型等等。

+0

但我怎么能知道是什么,可自动或没有做过? – J4N 2012-02-02 14:32:28

0

嗨,我知道这个问题有点老,但这可能有助于某人。如果你想进行渲染和回发复选框值的集合作为一个视图模型对象的一部分,并将其保存到数据库的MVC3教程,然后看看我这个问题的答案:

Saving many to many relationship data in MVC Create view

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