2012-05-13 40 views
2

視圖模型看起來是這樣的:使用Html.HiddenFor而迭代

public W { get; set; } 
public WC WC { get; set; } 
public List<TC> TCs { get; set; } 

WC具有TC的相關組。它們的關係由包含外鍵WCId的TC映射。

在視圖中,我有一個表單。在表格中,WC有輸入字段。然後,有一組TC取決於最大數量爲4的計數。每個TC都有一個相關的T,因爲該TC有一個外鍵TCId。我試圖確保當表格發佈時,TC有相關聯的TIdTId被保存在W中的T的列表中(即@Model.W.T.ElementAt(someindex).TId)。

如何獲取lambda表達式以便使用助手在視圖中生成此關係,以便它可以在關聯控制器的httppost操作中使用?

下面是我在做什麼現在:

<input type="hidden" value="@(Model.W.T.ElementAt(i).TId)" 
name="TCs[@(i)].TId" 
id="[email protected](i)__TId" data-val="true"/> 

我希望做的是使用@Html.HiddenFor助手,但似乎無法得到它的工作,所以我只是用略顯動感又不失硬編碼的方法以上。注意:這可行,但是,我希望它更乾淨。

回答

3

你現在正在做的是 - 據我所知 - 唯一的方法來做到這一點。我不知道更簡單的@Htm.HiddenFor(...)版本的方法。我也一直在處理類似的問題。不過,如果你認爲你可以重複使用上面的模式,你仍然可以創建自己的顯示/編輯器模板或其他更抽象的方式。當然,他們會比你的「醜陋」但是直截了當的方法更加冗長和複雜。

+0

感謝您的答覆。我沒有考慮過幫助這個人,因爲這看起來有點冒險。我不完全確定如何生成適當的屬性值,並且必須針對這種情況專門對這些屬性進行逆向工程。 –

+0

就ASP.NET MVC而言,它可能看起來很詭異,但在純HTML/HTTP中卻並非如此。 – Max

+0

如果您正在考慮編寫幫手,請查看Steve Sanderson的HtmlPrefixScopeExtensions。在做類似自己的事情時,我發現這很有用。 http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/ –

1

我把它做成了一個幫手,並決定分享它,以防其他人遇到此問題。

助手:

public static MvcHtmlString CustomHiddenFor(
     this HtmlHelper html, object ListValue, 
     string ListName, int ListIndex, string ListItem) 
    { 
     return MvcHtmlString.Create(
      string.Format("<input type=\"hidden\" value=\"{0}\" name=\"{1}[{2}].{3}\" id=\"{1}_{2}__{3}\" data-val=\"true\"/>", 
       ListValue.ToString(), 
       ListName, 
       ListIndex, 
       ListItem 
       )); 
    } 

使用(注意,這是從一個循環,i是迭代器完成的,任何值將在第一現場 - DUE):

@Html.CustomHiddenFor(Model.W.T.ElementAt(i).TId, "TCs", i, "TId")