【问题标题】:RadioButtonFor model binding not working with EnumRadioButtonFor 模型绑定不适用于 Enum
【发布时间】:2016-06-23 13:38:07
【问题描述】:

我正在尝试实现一个包含类似网格的单选按钮结构的表单。有四个单选按钮,可以选择其中一个。在模型中,我有一个 Enum 来保存四个选项,并且模型对此有参考。

枚举:

public enum HubType
{
    Hub5 = 0,
    Hub3 = 1,
    Router = 2,
    Others = 3,
}

模型:

public class Customer
{
    public string ReferenceId { get; set; }
    public CustomerType Type { get; set; }

    public int ChangesMade = 0;
    public DateTime MigrationDate { get; set; }
    public bool MigrationDateChanged = false;
    public List<SiteDetails> Sites = new List<SiteDetails>()
    {
        new SiteDetails { SiteAddress = "test address 1", Hub = HubType.Hub3 },
        new SiteDetails { SiteAddress = "test address 2", Hub = HubType.Hub5},
        new SiteDetails { SiteAddress = "test address 3", Hub = HubType.Router},
        new SiteDetails { SiteAddress = "test address 4", Hub = HubType.Hub5}
    };
}

SiteDetails.cs

public class SiteDetails
{
    public String SiteAddress { get; set; }
    public HubType Hub = HubType.Hub5;
}

最后是局部视图 SiteDetails.cshtml

@model MyApp.Models.Customer
@using MyApp.Models.Enums
@{
    var hubTypes = Enum.GetValues(typeof(HubType));
}

@using (Html.BeginForm("SiteDetails", "MyApp", FormMethod.Post))
{
    @for(int site = 0; site < Model.Sites.Count; site++)
    {
        @Model.Sites[site].SiteAddress
        @for (int hub = 0; hub < hubTypes.Length; hub++)
        {
            @Html.RadioButtonFor(m => m.Sites[site].Hub, hubTypes.GetValue(hub))
        }
        <input type="submit" class="button right" value="Save 
    }
}

当我提交页面时,我希望模型属性填充所选值,但现在不会发生这种情况。请帮助我探索我做错了什么以及是否有更好的方法来做到这一点。提前致谢!

【问题讨论】:

  • 您不能使用foreach 循环为集合生成表单控件。
  • 感谢您的回答。我已经用传统的 for 循环替换了 foreach 循环,但问题仍然存在。我已经编辑了代码以供查看。
  • 我重新打开了这个问题,但您还有多个其他错误 - 将很快添加答案。

标签: c# asp.net-mvc razor enums radio-button


【解决方案1】:

List&lt;SiteDetails&gt; SitesHubType Hub 是字段,而不是属性,因此 DefaultModelBinder 不能设置值。你需要让它们成为属性

public class Customer
{
    ....
    public List<SiteDetails> Sites { get; set; }
}
public class SiteDetails
{
    ....
    public HubType Hub = { get; set; }
}

然后在控制器(或无参数构造函数)中分配这些值。另请注意,int ChangesMadebool MigrationDateChanged 也是字段,但您似乎没有在视图中使用这些字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2015-06-27
    相关资源
    最近更新 更多