2012-02-12 69 views
0

您好我想顯式更改我的EditorFor輸出中的ID和名稱和Validate-For字段。嵌套編輯器中的ID字段覆蓋EditorFor

我有以下代碼:

Html.EditorFor(x => ViewBag.NestedFormDatas) 

上述前綴都與現款車型的名稱字段。

我的臨時解決方案如下(我知道這是很不理想,但它的工作!):

@Html.Raw(Html.EditorFor(x => ViewBag.NestedFormDatas).ToHtmlString().Replace("NestedForm", "DesiredPrefix")) 

回答

0

你肯定可以嘗試利用htmlAttributes參數與TextBoxFor重寫HTML屬性:

@Html.TextBoxFor(x=>item.Name,new { id="newId"}) 

我正在查看你的代碼的問題是,你正在使用動態視圖數據字典(ViewBag)和一個已知類型的對象屬性的方法。我強烈建議將ViewBag替換爲具有強類型集合的ViewModel。這將解決的字段命名您的問題(我只能假設,但是這是我能想到的一個原因的唯一的事情從你的輸入元素刪除前綴)

+0

我通常會同意使用ViewModel,但是我不這樣做的原因是因爲模型是正確的,但我用來創建視圖的方法有點不正規。這很難解釋。 基本上在我的視圖中,我選擇將對象列表移動到另一個編輯器模板中的另一個區域。這從用戶的角度來看是有道理的,但在代碼中,我必須修改ID字段以重新連接發佈的模型。 – 2012-02-12 19:01:51

+0

我的ID需要成爲'DesiredPrefix_0__NestedFormData_0__Property'以前它是'NestedForm_0__NestedFormData_0__Property' 在這種情況下的DesiredPrefix是模型上的另一個列表。 – 2012-02-12 19:06:27

2

我懷疑你需要改變idname屬性,因爲你沒有使用視圖模型。下面似乎只是這樣的錯誤:

@Html.EditorFor(x => ViewBag.NestedFormDatas) 

如果你正確使用視圖模型,你不需要改變名稱和ID,因爲編輯器模板將已經生成正確的價值觀:

@Html.EditorFor(x => x.NestedFormDatas) 

不管怎麼說,一種可能性是爲給定類型編寫自定義編輯器模板。因此,如果我們假設NestedFormDatas是,你可以添加以下~/Views/Shared/EditorTemplates/String.cshtml編輯模板覆蓋the default one,並允許您指定其他屬性字符串類型:至於

@Html.EditorFor(x => x.NestedFormDatas, new { id = "foo" }) 

@Html.TextBox(
    "", 
    ViewData.TemplateInfo.FormattedModelValue, 
    ViewData 
) 

,然後name屬性而言,這不是可以用TextBox助手重寫的內容。如果您需要實現這一點,您將不得不編寫自己的幫手。但正如我所說,如果你使用視圖模型,你永遠不需要這樣做,因爲這正是視圖模型的目的:它們被特別定義以匹配給定視圖的要求。

因此,請刪除代碼中的任何痕跡ViewBag,並開始定義視圖模型。您將看到ASP.NET MVC將變得多麼有趣和簡單。

+0

Darin,在這種情況下,是否有一個特殊的原因使id前綴爲@?我知道這是「類」的必須...更重要的是,我不認爲您的示例將作爲EditorFor不像TextBoxFor不具有覆蓋HTMLAttributes作爲輸入參數 – torm 2012-02-12 18:27:41

+0

@torm,絕對不是。這是我的錯誤複製粘貼。它已經被刪除。 – 2012-02-12 18:29:30

+0

哦,好吧,我認爲這背後有一種訣竅@ :) EditorFor怎麼樣?你可以檢查一下嗎 ? – torm 2012-02-12 18:33:52