2012-05-08 29 views
0

我正在使用C#.NET MVC3(Razor)創建一個簡單的表單。但在這種形式下,我需要以單選按鈕的形式打印列表的內容。但我不知道這是如何工作的:BeginForm中的Foreach和RadioButtonFor()元素中的顯示元素

@using(Html.BeginForm("Method", "Controller", FormMethod.Post)) 
{ 
    foreach (Items item in Model.Items) 
    { 
     <div> 
      @Html.RadioButtonFor(item->itemId) 
      @Html.LabelFor(item->description) 
     </div> 
    } 
} 

但這不起作用。

我大概可以使用普通的html標籤來創建單選按鈕。但那麼數據將不會自動保存在正確的位置?

我該如何做這項工作?

+0

究竟不起作用? – archil

+0

@archil不允許直接指定'item->屬性'。通常我會這樣做---(model => model.Property)---但現在我在foreach循環中,並且需要來自'item'的數據。---現在它給了我錯誤:**沒有重載方法'RadioButtonFor'需要1個參數** – w00

回答

6

我會建議你使用模板編輯器而不是寫這些循環:

@model MyViewModel 
@using(Html.BeginForm("Method", "Controller", FormMethod.Post)) 
{ 
    @Html.EditorFor(x => x.Items) 
} 

,現在確定它會自動被渲染的模型(~/Views/Shared/EditorTemplates/ItemViewModel.cshtml)的每個元素對應的編輯模板:

@model ItemViewModel 
<div> 
    @Html.RadioButtonFor(x => x.itemId, "1") 
    @Html.LabelFor(x => x.description) 
</div> 

請注意,除了選擇相應視圖模型屬性的lambda表達式之外,您還必須將第二個參數傳遞給Html.RadioButtonFor幫助器。如果用戶在提交表單時檢查此單選按鈕,則此參數表示將發送到服務器並綁定到相應屬性的值。

另請注意,這按慣例工作。如果我們假設主視圖模型中的Items屬性的類型爲IEnumerable<ItemViewModel>,則必須定義相應的編輯器模板,並且如果您不希望此模板是多個控制器之間共享。

+0

謝謝,這似乎是工作 – w00

0

的語法是有點不同:

@Html.RadioButtonFor(model => item.ItemId) 
@Html.LabelFor(model => item.Description) 

其他的一切看起來不錯。

[編輯]哇,我一定很累。是的,以下看起來很好,但只適用於display。檢查達林的編輯器模板的答案。

這個問題不是很明顯,但從您的意見看來,foreach中的item是另一個Enumerable。鳥巢的foreach循環,然後,以顯示屬性:

@foreach(var itemList in Model.Items) 
{ 
    foreach(var item in itemList) 
    { 
     <div> 
      @Html.RadioButtonFor(model => item.ItemId) 
      @Html.LabelFor(model => item.Description) 
     <div> 
    } 
} 

那是?我仍然不確定我是否理解正確。 :)

+0

我知道,但這次我在foreach循環。我的模型有一個IEnumerable列表,並且我正在通過foreach循環進行。我需要顯示它找到的每個項目的單選按鈕中IEnumerable的數據。任何想法? – w00

+0

假設循環中的每個'item'都是一個帶有'ItemId'和'Description'的類,那麼你的版本 - 修正語法 - 應該沒問題。 –

2

因爲你在foreach循環中。以下將工作。

foreach (Items item in Model.Items) 
{ 
    <div> 
     @Html.RadioButtonFor(item.itemId) 
     @Html.LabelFor(item.description) 
    </div> 
} 

如果你想保存所有你需要實現從零開始的索引解決方案如下

@{int i = 0} 
foreach (Items item in Model.Items) 
{ 
    <div> 
     @Html.RadioButtonFor(model =>model[i].itemId) 
     @Html.LabelFor(model =>model[i].description) 
    </div> 
    i++; 
}