2016-03-04 57 views
0

我创建了一个自定义TextBoxFor方法,以便在我的ViewModel上使用自定义的“InputField”类来简化在剃须刀中的开发。获取表达式的自定义对象<model,property>

视图模型

public enum FieldState 
{ 
    NORMAL, 
    DISABLED 
} 

public class InputField 
{ 
    public FieldState State 
    { 
     get; 
     internal set; 
    } 

    public string Value 
    { 
     get; 
     private set; 
    } 

    public InputField() 
    { 
     State = FieldState.NORMAL; 
     Value = string.Empty; 
    } 

    public override string ToString() 
    { 
     return Value; 
    } 

    public static implicit operator string(InputField field_) 
    { 
     return field_.Value ?? string.Empty; 
    } 
} 

public class PrintJobForm 
{ 
    public InputField Material 
    { 
     get; 
     set; 
    } 
} 

扩展

public static MvcHtmlString ClassedTextBoxFor<TModel, TProperty>(
    this HtmlHelper<TModel> html_, 
    Expression<Func<TModel, TProperty>> expr_, 
    string classes_ = "") 
    where TProperty : InputField 
{ 
    classes_ += " form-control"; 

    if (expr_.Compile().Invoke().State == FieldState.DISABLED) { 
     classes_ += " disabled"; 
    } 

    return html_.TextBoxFor(expr_, new { 
     @class = classes_ 
    }); 
} 

Form.cshtml

<div class="control-group"> 
    <div class="col-md-3"> 
     @Html.ClassedTextBoxFor(model_ => model_.Material) 
     @Html.ValidationMessageFor(model_ => model_.Material) 
    </div> 
</div> 

我想我想做的事很简单。目前的问题是此行

if (expr_.Compile().Invoke().State == FieldState.DISABLED) { 
    classes_ += " disabled"; 
} 

Invoke()要求TModel类型的参数。我怎样才能从表达式中获得这个,所以我可以在HTML中正确设置“禁用”状态?

回答

2

模型传递给视图的当前实例是html_

TModel model = html_.ViewData.Model; 

所以你可以使用它你Invoke

expr_.Compile().Invoke(model).State