我必须编写大量代码,以便从类生成Knockout JS模板。
说这样的话。
<li><span>Surname</span> <span data-bind="text: SURNAME"></span></li>我想在剃刀模板中调用它,比如...
@className.DisplayMeFor(c=>c.SURNAME)甚至是
@DisplayMeFor<className>(c=>c.SURNAME)但是我真的被卡住了,不知道从哪里开始。我显然需要阅读一些泛型的知识,但我认为应该是这样的……
public static class HtmlExtensions
{
public static MvcHtmlString DisplayMeFor<TModel, TValue>(this TModel htmlHelper, Expression<Func<TModel, TValue>> expression)
{
var s = expression.ToString(); //Clearly need a lot more code here to get name, DisplayName etc
return MvcHtmlString.Create(s);
}
}但这并没有提供对模型的扩展(即@vmAppeal.DisplayMeFor(...不编译。
有什么建议吗?
发布于 2012-02-21 22:44:05
我想出的解决方案是
public static class Exts
{
private const string Input = @"<div><span>{0} : </span><input data-bind='value: {1}'></input></div>";
private const string Display = @"<div><span>{0} : </span><span data-bind='text: {1}'></span></div>";
private const string DatePicker = @"<div><span>{0} : </span><input data-bind='datepicker: {1}, datepickerOptions: {{ dateFormat: ""dd/mm/yy""}}' /></div>";
public static MvcHtmlString TemplateFor<TModel>(Expression<Func<TModel, object>> expression, bool edit) where TModel : class , new()
{
var data = new ViewDataDictionary<TModel>();
var metadata = ModelMetadata.FromLambdaExpression(expression, data);
var typ = metadata.ModelType;
var s = edit? Input: Display;
if (typ == typeof(System.DateTime) ||typ == typeof(System.DateTime?))
{
s = edit ? DatePicker : Display;
}
return MvcHtmlString.Create(string.Format(s, metadata.GetDisplayName(), metadata.PropertyName));
}
}它被称为
@(Exts.TemplateFor<MyClass>(a=>a.MyField,true))发布于 2012-02-14 23:00:31
尝试为HtmlHelper而不是TModel创建扩展方法:
public static class HtmlExtensions
{
public static MvcHtmlString DisplayMeFor<TModel, TValue>(this HtmlHelper htmlHelper, Expression<Func<TModel, TValue>> expression)
{
// your code here
}
}在razor中,只需调用您的方法:
@Html.DisplayMeFor(c=>c.SURNAME)
https://stackoverflow.com/questions/9279059
复制相似问题