首页 > 解决方案 > 单选按钮始终选中项目显示 False

问题描述

我有一个 Razor 单选按钮,但总是选中的项目显示为 false。

代码

    @using (Html.BeginForm("NewsSubmit", "Home", FormMethod.Post))
            {
                <div class="card-body pt-5 flex-center flex-column">
                    <form class="form-checkout form-style-1">
                        <div class="form-group text-center mt-3 shipping-group">

                                @Html.RadioButtonFor(x=>x.IsUseRegisteredAddress,true,new { @class = "custom-control-input", @checked = " " })

                                @Html.RadioButtonFor(x => x.IsUseRegisteredAddress, false, new { @class = "custom-control-input",@checked = " " })

                        </div>
                   </form>
                 </div>
           }

控制器

Public ActionResult NewsSubmit(NewsTotal news)
{
return View();
}

DTO

public class NewsTotal()
{
public bool IsUseRegisteredAddress{get;set;}
}

标签: c#asp.netasp.net-mvcrazor

解决方案


问题似乎来自您的 viewmodel 属性的声明,该属性定义为bool,而且您在NewsTotal通过 using收到时也没有从控制器设置它return View(news)

public bool IsUseRegisteredAddress { get; set; }

由于默认值为boolfalse设置时,因此默认选中具有false值的单选按钮。如果要true用作默认值,则需要从返回带有 viewmodel 的视图的控制器操作中设置它:

[HttpPost]
public ActionResult NewsSubmit(NewsTotal news)
{    
    // set radio button state (optional, ignore this if it's already set in 'news' parameter)
    news.IsUseRegisteredAddress = true;

    // returning viewmodel is mandatory
    return View(news);
}

或者,如果您想将所有单选按钮设置为默认未选中,请指定Nullable<bool>viewmodel 属性:

public bool? IsUseRegisteredAddress { get; set; }

笔记:

1)您可能会考虑从中删除@checked属性,RadioButtonFor因为checked它是布尔属性,它表示属性存在时的选中状态(并且在属性不存在时未选中),如下所示:

@Html.RadioButtonFor(x => x.IsUseRegisteredAddress, true, new { @class = "custom-control-input" }) Yes

@Html.RadioButtonFor(x => x.IsUseRegisteredAddress, false, new { @class = "custom-control-input" }) No

如果checked属性存在于两个具有相同名称或组的单选按钮中,checked则默认情况下,具有属性的最后一个单选按钮将设置为选中。

2) 第二种形式<form class="form-checkout form-style-1">无效,因为它会创建嵌套形式。删除Html.BeginForm助手中的附加表单标签并设置主表单的样式:

@using (Html.BeginForm("NewsSubmit", "Home", FormMethod.Post, new { @class = "form-checkout form-style-1" }))
{
    // form contents
}

推荐阅读