使用EditorTemplate将字节显示为复选框?

时间:2012-04-09 18:51:28

标签: c# asp.net-mvc-3 mvc-editor-templates editortemplates

我的模特课:

public class StatusList
{
   public int StatusID {get;set;}
   [UIHint("ByteCheckbox")]
   public byte Active {get;set;}
}

在/ Views / Shared / EditorTemplates中我创建了一个名为ByteCheckbox.cshtml的文件

editortemplate ByteCheckbox包含(我的第3次尝试):

@model byte
@if (Model == 1)
{
    @Html.CheckBox("", true)
}
else
{
    @Html.CheckBox("", false) 
}

这样做很好地呈现一个复选框。当我更改复选框状态并尝试保存更改时,模型验证会抱怨值为“false”(或“true”)而不是预期的0或1。

如何修改editortemplate以允许转换值?

5 个答案:

答案 0 :(得分:2)

<击> 你试过这个吗?

<div class="editor-label">
    @Html.LabelFor(model => model.Active)
</div>
<div class="editor-field">
    @Html.CheckBoxFor(model => model.Active != 0)
    @Html.ValidationMessageFor(model => model.Active)
</div>

<击>

您可以在模型中执行此操作:

public class StatusList
{
   public int StatusID {get;set;}
   public byte Active {get;set;}
   [NotMapped]
   public bool ActiveBool
   {
       get { return Active > 0; }
       set { Active = value ? 1 : 0; }
   }
}

答案 1 :(得分:1)

不要使用Html.CheckBox;而是使用Html.EditorFor。您需要在Views / Shared / EditorTemplates中定义一个名为ByteCheckbox.cshtml的文件,以便它可以正常工作。

答案 2 :(得分:0)

您也可以使用自定义模型装订器。

以下是小数的示例,但您可以为byte类型执行此操作。

public class DecimalModelBinder : DefaultModelBinder {

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
        dynamic valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (valueProviderResult == null) {
            return base.BindModel(controllerContext, bindingContext);
        }

        return ((string)valueProviderResult.AttemptedValue).TryCDec();
    }

}

答案 3 :(得分:0)

尝试这个

    @model bool

   <div class="editor-for">
       @Html.CheckBox("", Model, new{@class="tickbox-single-line"})
   <div>

答案 4 :(得分:0)

尝试一下:

@Html.CheckBox("Model", "Model")