radioButtolListFor助手不需要-mvc
本文关键字:-mvc 不需要 radioButtolListFor | 更新日期: 2023-09-27 18:25:05
我参考了这篇文章stackoverflow和第二篇文章堆叠
我正在使用的RadioButtonList
public static MvcHtmlString RadioButtonListFor<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> expression,
IEnumerable<SelectListItem> listOfValues,
IDictionary<string, object> radioHtmlAttributes = null,
string ulClass = null)
{
ModelMetadata metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
if (radioHtmlAttributes == null)
radioHtmlAttributes = new RouteValueDictionary();
TagBuilder ulTag = new TagBuilder("ul");
if (!String.IsNullOrEmpty(ulClass))
ulTag.MergeAttribute("class", ulClass);
if (listOfValues != null)
{
// Create a radio button for each item in the list
foreach (SelectListItem item in listOfValues)
{
// Generate an id to be given to the radio button field
var id = string.Format("{0}_{1}", metaData.PropertyName, item.Value);
if (!radioHtmlAttributes.ContainsKey("id"))
radioHtmlAttributes.Add("id", id);
else
radioHtmlAttributes["id"] = id;
// Create and populate a radio button using the existing html helpers
var label = htmlHelper.Label(id, HttpUtility.HtmlEncode(item.Text));
var radio = htmlHelper.RadioButtonFor(expression, item.Value, radioHtmlAttributes).ToHtmlString();
// Create the html string that will be returned to the client
// e.g. <input data-val="true" data-val-required="You must select an option" id="TestRadio_1" name="TestRadio" type="radio" value="1" /><label for="TestRadio_1">Line1</label>
ulTag.InnerHtml += string.Format("<li>{0}{1}</li>", radio, label);
}
}
return MvcHtmlString.Create(ulTag.ToString(TagRenderMode.Normal));
}
我的问题是单选按钮是必需的,当我不检查单选按钮时。我有错误,该字段是必填字段,我如何禁用它??(在我的视图模型中,我不使用dataAnnotation Required)
这是我视图的一部分模型:
public class RegistrationViewModel
{
#region country
public string Country { get; set; }
private string CountryLabel { get; set; }
public ConfigurationParamValue CountryParam { get; set; }
#endregion
#region civilty
public int Civility { get; set; }
public ConfigurationParamValue CivilityParam { get; set; }
public string CivilityLabel { get; set; }
public List<Civility> ListCivilitys { get; set; }
#endregion
}
这是我观点的一部分:
<div id="city">
<div class="editor-label" style="@visibleCivility">
@Html.GetResource(Model.Category,Model.IsLocal,Constantes.CivilityLabel)
<div style="@mandatoryCivility">*</div>
</div>
<div class="editor-field">
@Html.RadioButtonListFor(m => m.Civility, new SelectList(Model.ListCivilitys,"ID","Name"))
@Html.ValidationMessageFor(model => model.Civility)
</div>
</div>
我不确定为什么,但HtmlHelper.RadioButtonFor方法似乎返回了一个包含"data val required"-属性的标记。如果你根本不想验证这个字段,你可以只对这个元素禁用ClientValidation,比如这个例子:
@{Html.EnableClientValidation(false);}
@Html.RadioButtonFor(m => m.MyRadioButton)
@{Html.EnableClientValidation(true);}
然而,我遇到了这个问题,希望这个需求依赖于另一个标签。我用来解决这个问题的一个解决方案是创建一个正则表达式来删除代码中的"data-val-required"属性。看起来像这样:
var radioButton = htmlHelper.RadioButtonFor(*parameters*);
var requiredAttribute = *check if required attribute was set manually*;
if (requiredAttribute == null)
{
Regex regex = new Regex("(data-val-required='"[a-zA-ZåäöÅÄÖ ''s ''. 0-9]*'")");
radioButton = regex.Replace(radioButton, "");
}
这以一种简单而通用的方式解决了我的问题。