2012-02-08 70 views
0

我最初创建这样转换成EditorTemplate的HtmlHelper

@model MyModel 
var items = // get items 
@Html.DropDownListFor(m => m.Id, items, new { id = Html.IdFor(m => m) }) 

这是由

@Html.EditorFor(m => m.SomeClass) 

其中SomeClassId属性调用编辑模板。 (IdFor是我的HTML助手之一)。

这会产生这样的

<select name="SomeClass.Id" id="SomeClass" /> 

现在我想改变编辑模板到HTML帮助,使我的电话看起来像这样

@Html.CustomEditorFor(m => m.SomeClass) 

我是从这个变化由于其更易于重用,因此成为助手的视图。

这是松散的我有什么:

public static MvcHtmlString CustomEditorFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) 
{ 
    var idString = htmlHelper.IdFor(expression); 
    var propertyValue = expression.Compile()(htmlHelper.ViewData.Model); 
    var items = // get items 
    return htmlHelper.DropDownListFor(expression, items, new {id = idString}); 
} 

然而,当我打电话的编辑,我得到这个HTML而不是我想要的。

<select name="SomeClass" id="SomeClass" /> 

如何修改的表达,足以让它“访问”的Id财产?

回答

1

试试这个:

public static MvcHtmlString CustomEditorFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) 
{ 
    var idString = htmlHelper.IdFor(expression); 
    var items = // get items 

    var param = Expression.Parameter(typeof(TModel), "m"); 
    var member = Expression.Property(
        Expression.Property(param, ExpressionHelper.GetExpressionText(expression)) 
       , "Id"); 

    var isNullable = Nullable.GetUnderlyingType(member.Type); 
    if (isNullable != null) { 
     var expr2 = Expression.Lambda<Func<TModel, int?>>(
         member, new[] { param } 
        ); 

     return htmlHelper.DropDownListFor(expr2, items, new { id = idString }); 
    } 

    var expr = Expression.Lambda<Func<TModel, int>>(
        member, new[] { param } 
       ); 

    return htmlHelper.DropDownListFor(expr, items, new { id = idString }); 
} 
+0

是'新的[] {Expression.Parameter(typeof运算(TModel的), “M”)}'依赖于我之前已经过去了?它可能不总是'm'。 – 2012-02-08 20:15:24

+0

我确实将'TProperty'约束到一个接口,所以它确实拥有它。 – 2012-02-08 20:41:16

+0

当Id属性可以是'int'或'int?'时,我该怎么办?我得到“当我使用'int?'时,'System.Int32'类型的表达式不能用于返回类型'System.Nullable'1 [System.Int32]''”。 – 2012-02-08 20:48:10