2011-05-15 51 views
1

簽名爲這個非常有用的方法,狀態我可以表明類型:EditorFor +的TModel

public static MvcHtmlString EditorFor<TModel, TValue>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TValue>> expression 
) 

...的文檔非常理解狀態的TModel是「該類型的模型」。我必須特別強調,這種描述對我來說毫無意義。我已經搜索了一個解釋,但發現zilch。

我在一個視圖中@model Website.Models.Product,但想創建一個不同類型的東西的編輯器。我以爲我可以:

@Html.EditorFor(@ViewBag.AClassOfTheOtherType) 

也許(我猜明顯):

@Html.EditorFor(TheOtherType) 

但是這是不能接受的語法,所以我想:

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

但拉姆達表達式似乎被綁定到@model ...所以我想,「啊!」:

@Html.EditoFor<TheOtherType>(...) 

但VS認爲<開始一個HTML標記,並指示我的EditorFor調用(失敗)的結束。

aaaaahhhhh!

我該如何做(如果我真的需要問)?

回答

0

答案是(drumroll please)...是的,可以將lambda表達式與類型聲明符綁定。唯一的問題是Visual Studio編輯器,它認爲一個結束了C#部分並輸入了開頭的<的HTML部分,因此不允許正確的代碼。解決方案:

@{ Html.EditoFor<TheOtherType>(...) } 
+0

對我不起作用:-( – 2013-04-14 14:20:36

0

模式 - 是模式 - M在MVC

的TModel也可以同樣是sdserweJJG - 它只是一貫要求的TModel了公約。

在輔助方法爲EditorFor你會看到類似這樣的:

TValue val = expression.Compile()(htmlHelper.ViewData.Model); 

這就是擴展方法編譯傳入的拉姆達 - 例如x=>x.Model.Property一部分 - 回來的實際模型數據使用構建實際的顯示控件。

當您從控制器操作中調用return View(viewModel);時,模型被傳遞到視圖。

你試圖做的事情沒有意義,因爲該方法被設計爲與視圖模型一起工作。

但是,您可以使用@Html.Editor,因爲這會採取的方式有實際價值,你正在嘗試:

@Html.Editor(ViewBag.AClassOfTheOtherType) 

對MVC的源代碼是免費提供下載和查看 - 這是值得花時間做所以:)

+0

so Model是我通過@model指令綁定的任何東西。但隨後,又有什麼用.EditorFor ()如果不是指定模型的類型(在打出電話中使用)是其他東西比模型? – ekkis 2011-05-15 20:52:03

+0

我試過'@ Html.Editor(ViewBag.AClassOfTheOtherType)',但似乎不支持的語法。有6點過載,沒有隻取一個對象這樣的...除此之外,確實。編輯()瞭解共享/ EditorTemplates?因爲我有些東西在裏面 – ekkis 2011-05-15 20:54:51

+0

封裝我得到什麼錯誤:「System.Web.Mvc.HtmlHelper 」中有一個名爲「編輯器」沒有適用的方法,但似乎有通過一個擴展方法名稱。擴展方法不能動態分派。考慮轉換動態參數或調用擴展方法而不使用擴展方法語法。 C:\用戶\ ekkis \文檔\ Visual Studio 2010的\項目\測試\網站\查看\ X \ Details.cshtml – ekkis 2011-05-15 23:37:39

2

沒有測試過這一點,但不能這樣做:

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

你不一定需要使用傳入LAMBDA變量。

+0

我沒有意識到我可以做到這一點。我會試一試。謝謝! – ekkis 2011-05-17 02:03:45