1

我参考这篇文章 stackoverflow第二篇文章 stackoverflow

我正在使用 RadioButtonListFor

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>
4

1 回答 1

1

我不知道为什么,但似乎 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, "");
}

这以一种简单而通用的方式解决了我的问题。

于 2016-06-03T05:24:03.673 回答