我想實現類似於@ Html.TextBoxFor的東西,但是改爲調用@ Html.SwitchFor()從我使用的bool創建一個yes/no開關,而不必每次都添加額外的html和類。如何製作自己的Razor Helper方法,如@ Html.TextBoxFor()?
有沒有辦法用剃刀語法來做到這一點?
我想實現類似於@ Html.TextBoxFor的東西,但是改爲調用@ Html.SwitchFor()從我使用的bool創建一個yes/no開關,而不必每次都添加額外的html和類。如何製作自己的Razor Helper方法,如@ Html.TextBoxFor()?
有沒有辦法用剃刀語法來做到這一點?
我發現了一些幫助Here:
一些簡單的示例代碼:
public static class HtmlHelperExtensions
{
public static MvcHtmlString SwitchSlider(this HtmlHelper helper, bool value)
{
return new MvcHtmlString("<div>html i want to output here</div>");
}
}
,它允許你這樣做:
@Html.SwitchSlider(true);
我仍然不確定如何複製類似的TextBox 對於並傳入x => x.param
你可能會對此有好運。
請注意,你會發現自己徘徊在TextBoxFor,點擊F12在Visual Studio中,你會得到你正在試圖模仿該方法的簽名。如果你不花時間,這是一個開始的好地方,雖然它有點難以閱讀。
public static MvcHtmlString SwitchFor<TModel>(
this HtmlHelper<TModel> helper, Expression<Func<TModel,
Object>> expression, Boolean wrap)
{
return wrap
? MvcHtmlString.Create(String.Format("<div class='helloworld'>{0}</div>",
helper.TextAreaFor(expression))) : helper.TextAreaFor(expression);
}
傳遞正確的東西
你需要一個表達傳遞給TextBoxFor擴展。 的方法簽名m =>是Func它將您的TModel(m)傳遞給該函數並返回一個對象。
做你想要什麼,並返回默認實現
你可以把任何東西在裏面。如果換行設置爲false,您可以看到我只是返回傳遞表達式的原始方法調用。
撥打電話
所有剩下要做的就是撥打電話,你本來打算在首位。
@(Html.SwitchFor(m => m.Data, true))
使它成爲一個助手
這是麻煩了一點,比我先預期,但它可以做到的,只要添加以下代碼到你的App_Code文件文件夾中CSHTML文件你的選擇。由於您不能在助手函數中使用泛型,因此必須在@function {}塊中創建具有正確簽名的實際函數。
@using System.Linq.Expressions
@using System.Web.Mvc;
@using System.Web.Mvc.Html;
@functions
{
public static HelperResult SwitchFor<TModel, Object>(HtmlHelper<TModel> html, Expression<Func<TModel, Object>> func, Boolean wrap)
{
var data = html.TextAreaFor(func);
return WrapItUp(data);
}
}
@helper WrapItUp(MvcHtmlString data)
{
<div class="helloworld">
@(data)
</div>
}
撥打電話,那麼幾乎
你要通過它的類型模型中的HtmlHelper實例。
@(Html.SwitchFor(Html, m => m.Data, true))
順便說一下, 這太棒了!它將幫助我以更自然的方式佈置多列窗體。我很高興遇到你的挑戰,因爲這是我沒有想到的解決方案。
好運N玩得開心!