radioButtolListFor不需要助手 - mvc

时间:2013-07-26 08:15:45

标签: c# asp.net-mvc validation razor data-annotations

我对此帖article stackoverflow感到遗憾 这个second article 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)

这是我的viewModel的一部分:

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>

1 个答案:

答案 0 :(得分:1)

我不知道为什么,但似乎HtmlHelper.RadioButtonFor方法返回一个包含“data-val-required”-attribute的标签。 如果您根本不想要对此字段进行验证,则可以为此元素禁用ClientValidation,如下例所示:

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, "");
}

然而,我有这个问题,并希望要求依赖于另一个标签。我用于此问题的一个解决方案是创建一个正则表达式来删除代码中的“data-val-required”属性。 看起来像这样:

select  name where id in (select id from ...)

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