使用可为空的枚举属性和带有空字符串值的addtional选项渲染radiobuttonfor

时间:2015-10-11 15:19:09

标签: c# razor

我正在尝试在页面上显示单选按钮,其中必须选择其中一个单选按钮,否则应显示错误。可用的三个选项是:

  • 手册
  • 自动
  • 不确定

选择“Unsure”没有意义添加到GearboxTransmission枚举,因为它只是表示用户此时不知道他们想要选择哪个选项。

我有以下枚举:

public enum GearboxTransmission
{
    Automatic,
    SemiAutomatic,
    Manual
}

型号:

public class BookingsIndexViewModel
{
    [Required(ErrorMessage = "Please select the preferred gearbox transmission to learn with.")]
    public GearboxTransmission? GearboxTransmission { get; set; }
}

和HTML:

<div class="form-group">
    <fieldset>
        <legend>Gearbox transmission</legend>
        <div class="radio">
            <label>
                @Html.RadioButtonFor(m => m.GearboxTransmission, GearboxTransmission.Manual) Manual
            </label>
        </div>
        <div class="radio">
            <label>
                @Html.RadioButtonFor(m => m.GearboxTransmission, GearboxTransmission.Automatic) Automatic
            </label>
        </div>
        <div class="radio">
            <label>
                @Html.RadioButtonFor(m => m.GearboxTransmission, string.Empty) Unsure
            </label>
        </div>
        @Html.ValidationMessageFor(m => m.GearboxTransmission, null, new { @class = "text-danger" })
    </fieldset>
</div>

由于我已将GearboxTransmission属性设置为可空,我希望通过在页面回发时创建一个空字符串值为单位的单选按钮,GearboxTransmission属性为null,表示选择了“Unsure”选项

实际发生的是模型视图状态无效且验证消息“请选择要学习的首选变速箱传输”。由于GearboxTransmission属性上的必需属性而出现。

我希望你必须指定一个选项,如果你不这样做,你会收到错误“请选择首选的变速箱传输来学习”。除非您选择“不确定”单选按钮,否则表单将被提交。

1 个答案:

答案 0 :(得分:2)

你的代码似乎并不是错的,尽管如果不运行它我就无法说出来。此外,您还知道这有什么问题 - 您的验证需要&#39;有一个选择。

&#39;必需&#39;并没有真正检查单击单选按钮,而是检查用户是否选择了一个值。

显然,当您的某个选项的值为空(您关注?)时,您无法使用验证来显示基于未选择值的错误消息。

有2个答案:

A)忘记错误信息,并将无线电默认为“不确定”&#39;虽然这可能会降低数据捕获的质量。 B)使用“不确定”的实际值,将其添加到GearboxTransmission枚举并通过模型和视图等流动。这将允许您的空选择工作。

如果你真的必须在没有&#39; Unsure&#39;的情况下得到枚举值,请使用第二个进行模型绑定,但将模型枚举复制到控制器中的DB Enum。

希望这有帮助。