我使用自定义" InputField"创建了一个自定义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中的状态?
答案 0 :(得分:2)
传递给视图的当前模型实例位于html_
:
TModel model = html_.ViewData.Model;
因此,您可以在Invoke
:
expr_.Compile().Invoke(model).State