【问题标题】:Select 1 radiobutton out of three从三个中选择 1 个单选按钮
【发布时间】:2014-03-07 12:23:24
【问题描述】:

我以前在 MVC 项目中没有使用过单选按钮。 现在,自从我第一次使用它以来,我似乎遇到了一个问题。

我想要做的是,会有问题,用户可以从可用的答案中选择一个答案。每个答案都有一个单选按钮。

这是我的模型

public class CreateAppointmentSelectOptions
{
    public Guid AppointmentId { get; set; }

    //question1
    [Display(Name = "Repeat invitation untill a common date is found")]
    public bool RepeatTillCommonDateIsFound { get; set; }


    [Display(Name = "Repeat times")]
    [Range(1,5,ErrorMessage="Repeat times must be between {1} and {2}")]
    public int RepeatTimes { get; set; }

    //question 1
    [Display(Name="Repeat invitation once")]
    public Boolean RepeatOnce { get; set; }

    //question 1
    [Display(Name="Do not repeat invitation")]
    public Boolean NoRepeat { get; set; }

    //question 2
    [Display(Name = "Cancel the invitation")]
    public Boolean CancelInvitation { get; set; }

    //question 2    
    [Display(Name="Plan appointment with my first available date")]
    public Boolean FirstAvailableCommon { get; set; }

    //question 2 
    [Display(Name="Plan with all participants available on the first available common date")]
    public Boolean OwnerFirstAvailableCommon { get; set; }       
}

控制器

[HttpGet]
public ActionResult Create_WhatIf(Guid appointmentId)
{
    var appointmentCondition = new CreateAppointmentSelectOptions
    {
        AppointmentId = appointmentId,
        RepeatOnce = true,
        NoRepeat = false,
        RepeatTillCommonDateIsFound=false,
        CancelInvitation = false,
        OwnerFirstAvailableCommon=false,
        FirstAvailableCommon = true
    };
    return View(appointmentCondition);
}

[HttpPost]
public ActionResult Create_WhatIf(CreateAppointmentSelectOptions options)
{
    return View();
}

以及观点

@model CreateAppointmentSelectOptions
@{
    ViewBag.Title = "Create_WhatIf";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>What If?</h2>
@using (Html.BeginForm("Create_WhatIf", "Appointment", FormMethod.Post))
{
    @Html.HiddenFor(m=>m.AppointmentId)


    <div class="col-md-10">
        <h3>What would you like to do if a common appointment with all participants cannot be made after the first invitation?</h3>
        <div class='well'>
            <div class="form-group">              
                <div class="input-group">
                    @Html.RadioButtonFor(m => m.RepeatTillCommonDateIsFound,Model.RepeatTillCommonDateIsFound)
                    @Html.LabelFor(m => m.RepeatTillCommonDateIsFound)
                </div>               
                <div id="RepeatTimes">
                    @Html.EditorFor(m=>m.RepeatTimes)
                </div>
                <div class="input-group">
                    @Html.RadioButtonFor(m => m.RepeatOnce,Model.RepeatOnce)&nbsp;&nbsp;
                    @Html.LabelFor(m => m.RepeatOnce)
                </div> 
                <div class="input-group">
                    @Html.RadioButtonFor(m => m.NoRepeat,Model.NoRepeat)&nbsp;&nbsp;
                    @Html.LabelFor(m => m.NoRepeat)
                </div>           
            </div>
        </div>
    </div>

    <div class="col-md-10">
        <h3>What would you like to do if a common appointment cannot be made in the end?</h3>
        <div class='well'>
            <div class="form-group">         
                <div class="input-group">
                    @Html.RadioButtonFor(m => m.CancelInvitation,Model.CancelInvitation)&nbsp;&nbsp;
                    @Html.LabelFor(m => m.CancelInvitation)
                </div>                             
                <div class="input-group">
                    @Html.RadioButtonFor(m => m.OwnerFirstAvailableCommon,Model.OwnerFirstAvailableCommon)&nbsp;&nbsp;
                    @Html.LabelFor(m => m.OwnerFirstAvailableCommon)
                </div> 
                <div class="input-group">
                    @Html.RadioButtonFor(m => m.FirstAvailableCommon,Model.FirstAvailableCommon)&nbsp;&nbsp;
                    @Html.LabelFor(m => m.FirstAvailableCommon)
                </div>           
            </div>
        </div>
    </div>

     <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input class="btn btn-default" value="<<Previous" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            <input type="submit" class="btn btn-default" value="Next>>" />
        </div>
    </div>

}
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
@Scripts.Render("~/bundles/jqueryval")

这是当前在浏览器中呈现的视图 问题

(好吧,问题下方的编辑器是您可以忽略的。) 为什么默认选择所有单选按钮?为了确保每个问题只能选择 1 个单选按钮,我应该怎么做?

【问题讨论】:

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


    【解决方案1】:

    【讨论】:

    • OP 正在使用 ASP.NET MVC,此解决方案适用于 Web 窗体。
    【解决方案2】:

    试试这个

    @Html.RadioButtonFor(m => m.CancelInvitation,Model.CancelInvitation,new { Name = "grp" })&nbsp;&nbsp;
    @Html.RadioButtonFor(m => m.OwnerFirstAvailableCommon,Model.OwnerFirstAvailableCommon,new { Name = "grp" })&nbsp;&nbsp;
    @Html.RadioButtonFor(m => m.FirstAvailableCommon,Model.FirstAvailableCommon,new { Name = "grp" })&nbsp;&nbsp
    

    【讨论】:

    • 这行得通吗?这不会将单选按钮的名称设置为“grp”并破坏数据绑定吗?又因为RadioButtonFor()的前两个参数是一样的,难道不是所有的按钮都被检查了吗?
    • 您的代码也是正确的,但它的要求不同。我的代码也可以工作。它是用列名绑定模型属性
    • 这行得通,但是当提交表单时,所有值都是假的,即使是选定的也是如此
    • 请对此提出另一个问题。
    【解决方案3】:

    每组单选按钮都应绑定到模型上的相同属性。目前,每台收音机都是自己的财产,因此属于自己的组。并且它们都被检查,因为传递给它的 2 个参数是相同的,所以比较总是返回 true(例如,m =&gt; m.RepeatOnceModel.RepeatOnce 相等,因此检查无线电)。

    相反,您需要在视图模型上添加 1 个属性来表示每个组。比如第2题……

    @Html.RadioButtonFor(m => m.Question2Answer, "CancelInvitation")
    @Html.RadioButtonFor(m => m.Question2Answer, "OwnerFirstAvailableCommon")
    @Html.RadioButtonFor(m => m.Question2Answer, "FirstAvailableCommon")
    

    如果选择了相应的值,则第二个值是分配给Question2Answer 的值。 (这里我使用的是字符串,但你也可以使用枚举)

    提交表单时,您必须使用Question2Answer 中的值来填充模型上的CancelInvitationOwnerFirstAvailableCommonFirstAvailableCommon 属性。同样,如果您显示现有实体,则必须在渲染视图之前填充视图模型上的 Question2Answer 属性。

    --- 更新---

    视图模型看起来像这样。在您的控制器中,您需要从模型中填充它...

    public class CreateAppointmentSelectOptionsViewModel
    {
        public Guid AppointmentId { get; set; }
    
    
        [Display(Name = "Repeat times")]
        [Range(1,5,ErrorMessage="Repeat times must be between {1} and {2}")]
        public int RepeatTimes { get; set; }
    
        public string Question1Answer { get; set; } // should have a more meaningful name
    
        public string Question2Answer { get; set; } 
    }
    

    【讨论】:

    • 我喜欢你的回答,但根据你的回答,我的 ViewModel 会是什么样子?
    • 我尝试在我的视图模型中添加带有字符串类型的 question1 和 question2。现在,提交表单时,question1 和 2 的值似乎设置为所选单选按钮的 id。例如,如果在question2中选择了CancelInvitation,则表单提交时的question2值变为CancelInvitation。是否可以将 viewmodel 的 cancelInvitation 值设置为 true,将问题 2 中的其他值设置为 false?
    • 我不这么认为。归根结底,Razor 视图正在呈现 HTML。 HTML 单选按钮组将单个文本值传递给服务器(在这方面它们的行为与选择/下拉框完全相同)。您需要执行额外的逻辑来将此 HTML 行为映射到您发送到后端的模型。
    • 所以,我需要手动检查该值并将属性设置为 true 或 false,如果我有三个答案,那么这意味着三个如果然后设置这个 true 和其他 false。如果有五个答案,那么如果 value 等于 this 然后设置这个 true 和其他 false??
    • 正确。通常,适合显示为下拉列表或一组单选按钮的值存储为一个属性而不是几个布尔值(一次不能选择多个)......所以这通常不是问题。如果您需要单独存储它们,您将不得不做一些工作。
    猜你喜欢
    • 1970-01-01
    • 2011-07-03
    • 2021-07-29
    • 2011-10-28
    • 2011-08-14
    • 2016-09-24
    • 2011-09-16
    • 2011-03-12
    相关资源
    最近更新 更多