Asp.net mvc ASP.NET MVC RadioButtonListFor始终是预设的

Asp.net mvc ASP.NET MVC RadioButtonListFor始终是预设的,asp.net-mvc,Asp.net Mvc,我有一个RadioButtonList用于自定义适配器工作,但是如果用户表单数据被重置,并且之前没有提交任何数据,则其中一个单选按钮(第一个)总是被预选的,我想避免这种情况,我如何才能实现这一点 @Html.RadioButtonForSelectList(model => model.ViewModelForThingCreate.ThingTypeID, Model.ViewModelForCarCreate.CarTypeSelectList) 以及: public static

我有一个RadioButtonList用于自定义适配器工作,但是如果用户表单数据被重置,并且之前没有提交任何数据,则其中一个单选按钮(第一个)总是被预选的,我想避免这种情况,我如何才能实现这一点

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

public static MvcHtmlString RadioButtonForSelectList(此HtmlHelper HtmlHelper、表达式表达式、IEnumerable ListOfValues)
{
var MetaData=modelmetada.FromLambdaExpression(表达式,HTMLHelper.ViewData);
var SB=新的StringBuilder();
if(ListOfValues!=null)
{
foreach(在ListOfValues中选择ListItem项)
{
var ID=string.Format(“{0}{1}”,MetaData.PropertyName,Item.Value);
var Radio=htmlhelp.RadioButtonFor(表达式,Item.Value,new{id=id}).ToHtmlString();
SB.AppendFormat(“{1}{2}”,ID,Radio,HttpUtility.HtmlEncode(Item.Text));
}
}
返回MvcHtmlString.Create(SB.ToString());
}

谢谢

这是您的自定义助手,按钮设置为“未选中”。试试这个,我想它会使所有单选按钮都未选中

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());
        }
public static MvcHtmlString RadioButtonForSelectList(此HtmlHelper HtmlHelper、表达式表达式、IEnumerable ListOfValues)
{
var MetaData=modelmetada.FromLambdaExpression(表达式,HTMLHelper.ViewData);
var SB=新的StringBuilder();
if(ListOfValues!=null)
{
foreach(在ListOfValues中选择ListItem项)
{
var ID=string.Format(“{0}{1}”,MetaData.PropertyName,Item.Value);
var Radio=htmlhelp.RadioButtonFor(表达式,Item.Value,new{id=id}).ToHtmlString();
SB.AppendFormat(“{1}{2}”,ID,Radio,HttpUtility.HtmlEncode(Item.Text));
}
}
返回MvcHtmlString.Create(SB.ToString());
}

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

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

foreach(button in ButtonGroup){
button.checked = false;
}

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

 public class IndexModel
 {
     public string ID;
     public IEnumerable<SelectListItem> Elements;
 }
公共类索引模型
{
公共字符串ID;
公共可数元素;
}
然后创建实例并填充值:

var model = new IndexModel()
            {
                ID = "a",
                Elements = 
                       new List<SelectListItem>() { 
                                                    new SelectListItem() { Text = "test1", Value = "1"},
                                                    new SelectListItem() { Text = "test2", Value = "2"}}
            };
var模型=新索引模型()
{
ID=“a”,
元素=
新列表(){
新建SelectListItem(){Text=“test1”,Value=“1”},
新建SelectListItem(){Text=“test2”,Value=“2”}
};
鉴于此,我使用了您的扩展方法

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

@(Extensions.RadioButtonForSelectList(Html,x=>x.ID,Model.Elements))
重置
发射后一切似乎都很好。加载时未选择字段,按“重置”按钮后将清除字段

我不确定我是否完全理解您想要实现的目标,您能否提供更多细节:-)

编辑:

下面是单选按钮的纯HTML示例。它们肯定不是在开始时填写的,如果您希望它们是必需的,请添加必需的,但默认情况下,您可以发送表单,而无需选择任何单选按钮。您还可以通过添加checked(如第二个示例中所示)使其处于选中状态。您是否在客户端使用javascript?也许是它引起了这种副作用


妈的!让我想想另一个approach@Baconbeastnz,我唯一能想到的就是JS。但是这感觉不对,你觉得使用js怎么样?这永远是最后的手段…看看Darin的这个精巧的单选按钮助手,单选按钮必须始终被选中?这肯定不正确?单选按钮要求一个为真,因为它们用于强制用户选择其中一个选项。如果您使用了复选框,并且JS代码在选中一个复选框时禁用了其他复选框,那么您可以将所有复选框都标记为false。如果您需要一个未选中的,那么这可能是一个更好的实现。我相信你可以让他们不被选中。不管怎样,对,这就是我要告诉你的。默认情况下,组中始终选择一个单选按钮。如果您没有将一个设置为true,那么列表中的第一个将始终首先被选中。请看下面,这是false。
<form>
@(Extensions.RadioButtonForSelectList(Html, x => x.ID, Model.Elements))
<button type="reset">Reset</button>
</form>