2012-02-02 102 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代碼和控制器操作以首先呈現,然後將發佈的後臺數據保存到數據庫。