我想实现类似于@ Html.TextBoxFor的东西,而是调用@ Html.SwitchFor()来创建一个我正在使用的bool的yes / no开关,而不必每次都添加额外的html和类。
有没有办法用剃刀语法来做到这一点?
答案 0 :(得分:1)
你可能会有运气。
请注意,您应该发现自己将鼠标悬停在 TextBoxFor 上,然后点击 Visual Studio 中的 F12 ,您将获得该方法的签名你是想模仿。这是一个很好的起点,但如果你没有花时间,它有点难以阅读。
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 =&gt; 的方法签名是 Func ,它将 TModel (m)传递给函数并返回一个对象。
执行您想要的操作并返回默认实施
你可以放任何东西。如果 wrap 设置为false,您可以看到我只返回传递表达式的原始方法调用。
拨打电话
剩下要做的就是按照你原先想要的方式拨打电话。
@(Html.SwitchFor(m => m.Data, true))
让它成为帮手
这比我最初预期的要复杂一点但是可以完成,只需将以下代码添加到您选择的 cshtml 文件中的 App_Code 文件夹中。由于您无法在辅助函数中使用泛型,因此您必须在 @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玩得开心!
答案 1 :(得分:0)
我找到了一些帮助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 For 和传入x =&gt;等内容。 x.param