获取表达式<model,property =“”>的自定义对象

时间:2016-03-04 09:35:15

标签: c# asp.net-mvc-4 razor lambda

我使用自定义&#34; InputField&#34;创建了一个自定义TextBoxFor方法来简化我在剃刀中的开发。我的ViewModel上的类。

视图模型

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类型的参数。我怎样才能从表达式中得到这个,所以我可以正确设置&#34;禁用&#34; HTML中的状态?

1 个答案:

答案 0 :(得分:2)

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

TModel model = html_.ViewData.Model;

因此,您可以在Invoke

中使用它
expr_.Compile().Invoke(model).State