我正在尝试编写自己的Html辅助方法,这些方法接受lambda表达式,如内置帮助器(TextBoxFor,CheckBoxFor,LabelFor等)。我已经找到了一些有用的信息(How I can use a method of a model in a custom HtmlHelper以及Scott Allen的http://odetocode.com/blogs/scott/archive/2012/11/26/why-all-the-lambdas.aspx),但我无法将各个部分组合在一起。我迷失在仿制药和lambda之间的相互作用。或者其他什么。
我的情况与上面的例子略有不同 - 我正在尝试编写一个数据网格编辑功能,允许就地编辑HTML表格中的行。 (我在经典的ASP中做过这样的事情,我正在尝试在MVC中实现。)网格编辑控件需要一点点状态 - 行ID和发布更改的URL。所以,我的帮助器方法不会是HtmlHelper的静态扩展。至少我不这么认为。所以,我的问题不是关于网格编辑功能(我已经或多或少地掌握了),但实际上只是关于如何设置我的帮助方法,以便它们接受行为类似于内置帮助器的lambda。 (我希望从我的视角中获得强类型的好处。我可以使用反射和字符串args来生成我的标记,但我知道我可以做得更好。)
到目前为止,我在剃须刀视图中尝试使用它 - 请注意GridEditor对象:
@foreach (var item in Model.Items)
{
var ge = new GridEditor<MyProject.SomethingFromMyDataModel>(item.ID, "someUrl");
<tr>
<td>@ge.CheckBox(x => x.SomeBooleanProperty)</td>
<td>@ge.TextBox(x => x.ATextProperty)</td>
<td>@ge.DropDownList(x => x.SomeForeignKey, ViewBag.MyList as SelectList)</td>
<td>@ge.Controls()</td>
</tr>
}
这不起作用,但我希望它可以让你知道我想要做什么。我的GridEditor类是这样设置的。我有点抓住稻草......注意我没有包括所有东西 - 而是我认为相关的东西。
public class GridEditor<TModel> where <TModel> : class
{
public GridEditor(int rowID, string postUrl)
{
}
public MvcHtmlString CheckBox<TModel, TValue>(Expression<Func<TModel, TValue>> expression)
{
}
}
无论如何,就像我说的那样无效。把它煮熟 - 我的问题是 - 如何设置我的CheckBox(和类似的)方法,以便它们接受一个强大的类型传递给我的GridEditor的lambda?
答案 0 :(得分:1)
睡觉之后,我发现答案很简单....因为我的GridEditor上的方法是实例(不是静态的),我应该在类定义上使用TModel泛型参数(就像我开始的那样) ),但随后从后续方法定义中省略它。例如:
public class GridEditor<TModel> : where TModel : class
{
public MvcHtmlString CheckBox<TValue>(Expression<Func<TModel, TValue>> expression)
{
}
}
在使用中(在razor中构建html表的foreach循环内),它看起来像这样:
@foreach (var pi in Model.Items)
{
var ge = new GridEditor<AdamOneilSoftware.Models.ProfileItem>("/ServiceProfile/SaveItem", pi.ID);
<tr>
<td>@ge.CheckBox(x => x.AutoAdd)</td>
<td>@ge.DropDownList(x => x.ItemID, ViewBag.ItemID as SelectList)</td>
<td>@ge.TextBox(x => x.UnitPrice)</td>
<td>@ge.Controls()</td>
</tr>
}