6

我有一个用于自定义适配器的单选按钮列表,但是如果重置了用户表单数据,并且之前没有提交任何数据,则始终预先选择一个单选按钮(第一个),我想避免这种情况,我该如何实现?

@Html.RadioButtonForSelectList(model => model.ViewModelForThingCreate.ThingTypeID, Model.ViewModelForCarCreate.CarTypeSelectList)

和:

public static MvcHtmlString RadioButtonForSelectList<TModel, TProperty>(this HtmlHelper<TModel> HTMLHelper,Expression<Func<TModel, TProperty>> Expression, IEnumerable<SelectListItem> ListOfValues)
        {
            var MetaData = ModelMetadata.FromLambdaExpression(Expression, HTMLHelper.ViewData);
            var SB = new StringBuilder();

            if (ListOfValues != null)
            {
                foreach (SelectListItem Item in ListOfValues)
                {
                    var ID = string.Format("{0}_{1}", MetaData.PropertyName, Item.Value);
                    var Radio = HTMLHelper.RadioButtonFor(Expression, Item.Value, new { id = ID }).ToHtmlString();
                    SB.AppendFormat("<label class=\"radio inline\" for=\"{0}\">{1} {2}</label>", ID, Radio, HttpUtility.HtmlEncode(Item.Text));
                }
            }
            return MvcHtmlString.Create(SB.ToString());
        }

谢谢!

4

3 回答 3

2

这是您的自定义助手,其按钮设置为未选中。试试这个,我假设它会使所有单选按钮都处于未选中状态。

public static MvcHtmlString RadioButtonForSelectList<TModel, TProperty>(this HtmlHelper<TModel> HTMLHelper,Expression<Func<TModel, TProperty>> Expression, IEnumerable<SelectListItem> ListOfValues)
        {
            var MetaData = ModelMetadata.FromLambdaExpression(Expression, HTMLHelper.ViewData);
            var SB = new StringBuilder();

            if (ListOfValues != null)
            {
                foreach (SelectListItem Item in ListOfValues)
                {
                    var ID = string.Format("{0}_{1}", MetaData.PropertyName, Item.Value);
                    var Radio = HTMLHelper.RadioButtonFor(Expression, Item.Value, new { id = ID }).ToHtmlString();
                    SB.AppendFormat("<label class=\"radio inline\" checked="false" for=\"{0}\">{1} {2}</label>", ID, Radio, HttpUtility.HtmlEncode(Item.Text));
                }
            }
            return MvcHtmlString.Create(SB.ToString());
        }
于 2013-02-16T03:36:42.180 回答
1

我刚刚在 mvc3 模板中尝试了你的方法,它似乎对我来说很好。基本上我已经创建了一些模型

 public class IndexModel
 {
     public string ID;
     public IEnumerable<SelectListItem> Elements;
 }

然后创建实例并填充值:

var model = new IndexModel()
            {
                ID = "a",
                Elements = 
                       new List<SelectListItem>() { 
                                                    new SelectListItem() { Text = "test1", Value = "1"},
                                                    new SelectListItem() { Text = "test2", Value = "2"}}
            };

鉴于我已经使用了您的扩展方法

<form>
@(Extensions.RadioButtonForSelectList(Html, x => x.ID, Model.Elements))
<button type="reset">Reset</button>
</form>

发射后一切似乎都很好。加载时未选择字段,并在按下“重置”按钮后将其清除。

在此处输入图像描述

您能否提供更多详细信息,因为我不确定我是否完全理解您要实现的目标:-)

编辑:

这是单选按钮的纯 HTML 示例。他们绝对不会在开始时填写,如果您希望他们需要添加但默认情况下您可以在不选择任何单选按钮的情况下发送表单。您也可以像第二个示例一样通过添加检查来进行检查。你在客户端使用一些javascript吗?也许它导致了这种副作用? http://jsbin.com/isadun/1

mz

于 2013-02-27T23:04:33.990 回答
1

不幸的是,必须始终选中一个单选按钮。这就是单选按钮的不幸之处。但是,您始终可以在表单中添加一个隐藏的单选按钮并将选中的属性设置为 true;如果没有从中选择任何内容,则让您的内部代码接受 null 或您期望的任何内容。

尝试将所有单选按钮值设置为未选中或 false

foreach(button in ButtonGroup){
button.checked = false;
}
于 2013-02-26T20:38:49.033 回答