【问题标题】:TextBoxFor rendering to HTML with prefix on the ID attributeTextBoxFor 呈现为带有 ID 属性前缀的 HTML
【发布时间】:2010-01-12 20:08:48
【问题描述】:

我有一个 ASPNET MVC 2 项目。当我使用

<%= Html.TextBoxFor(model => model.Login) %>

TexBoxFor 将呈现为

<input id="Login" name="Login" type="text" value="" />

模型中的字段是

[Required(ErrorMessage = "")]
[DisplayName("Login")]
public string Login { get; set; }

我可以为 idname 属性加上一些前缀吗?喜欢

<input id="prefixLogin" name="prefixLogin" type="text" value="" />

谢谢大家。

【问题讨论】:

    标签: c# asp.net-mvc-2


    【解决方案1】:

    似乎 MVC 2 RTM 目前不提供此功能。你可以试试这些扩展方法:

                    public static MvcHtmlString ValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression)
        {
            return ValidationMessageFor(htmlHelper, prefix, expression, null, new RouteValueDictionary());
        }
    
        public static MvcHtmlString ValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression, string validationMessage)
        {
            return ValidationMessageFor(htmlHelper, prefix, expression, validationMessage, new RouteValueDictionary());
        }
    
        public static MvcHtmlString ValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression, string validationMessage, object htmlAttributes)
        {
            return ValidationMessageFor(htmlHelper, prefix, expression, validationMessage, new RouteValueDictionary(htmlAttributes));
        }
    
        public static MvcHtmlString ValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression, string validationMessage, IDictionary<string, object> htmlAttributes)
        {
            return htmlHelper.ValidationMessage(String.Format("{0}.{1}", prefix, ExpressionHelper.GetExpressionText(expression)),
                validationMessage,
                htmlAttributes);
        }
    
        public static MvcHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression)
        {
            return HiddenFor(htmlHelper, prefix, expression, (IDictionary<string, object>)null);
        }
    
        public static MvcHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
        {
            return HiddenFor(htmlHelper, prefix, expression, new RouteValueDictionary(htmlAttributes));
        }
    
        public static MvcHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes)
        {
            return htmlHelper.Hidden(String.Format("{0}.{1}", prefix, ExpressionHelper.GetExpressionText(expression)),
                ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model,
                htmlAttributes);
            /*return HiddenHelper(htmlHelper,
                                ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model,
                                false,
                                ExpressionHelper.GetExpressionText(expression),
                                htmlAttributes);*/
        }
    
        public static MvcHtmlString TextAreaFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression)
        {
            return TextAreaFor(htmlHelper, prefix, expression, (IDictionary<string, object>)null);
        }
    
        public static MvcHtmlString TextAreaFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
        {
            return TextAreaFor(htmlHelper, prefix, expression, new RouteValueDictionary(htmlAttributes));
        }
    
        public static MvcHtmlString TextAreaFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes)
        {
            if (expression == null)
            {
                throw new ArgumentNullException("expression");
            }
    
            string value;
            var modelMetadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
            if (modelMetadata.Model != null)
                value = modelMetadata.Model.ToString();
            else
                value = String.Empty;
    
            return htmlHelper.TextArea(String.Format("{0}.{1}", prefix, ExpressionHelper.GetExpressionText(expression)),
                value,
                htmlAttributes);
        }
    
        public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression)
        {
            return TextBoxFor(htmlHelper, prefix, expression, (IDictionary<string, object>)null);
        }
    
        public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
        {
            return TextBoxFor(htmlHelper, prefix, expression, new RouteValueDictionary(htmlAttributes));
        }
    
        public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes)
        {
            return htmlHelper.TextBox(String.Format("{0}.{1}", prefix, ExpressionHelper.GetExpressionText(expression)),
                ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model,
                htmlAttributes);
        }
    

    【讨论】:

    • 我需要这个,因为我需要在某些对象上设置前缀,但在其他对象上不需要。
    【解决方案2】:

    您始终可以设置htmlAttributes,尽管这不是最干净的方式。
    而且,您必须在所有助手中都这样做。

     <%: Html.TextBoxFor(model => model.Login, new { @id = "prefixLogin" }) %>
    

    【讨论】:

    • 有人实际验证过这是否有效吗?因为我认为不会。我认为您不能使用内置 HtmlHelper 使用匿名对象设置名称或 id 属性,因为它将其值合并到您的对象 htmlAttributes 之上。我创建了一些自定义助手供我自己使用,我重新排序了用法,以便如果我愿意,我可以按照您在此处所说的进行操作。
    • 'id' 属性可以更改,但 'name' 不能。 “名称”被覆盖。问题是,如果 id 字段的更改不一致,LabelFor、ValidationMessageFor 和 TextBoxFor(示例)将不同步,因此扩展方法是可行的方法。
    【解决方案3】:

    对于同一个问题有不同的不同解决方案.. 我创建了一个新的 mvc 测试项目,并将整个视图的 web.config 复制到我遇到此错误的旧项目中,解决了

    【讨论】:

      猜你喜欢
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      相关资源
      最近更新 更多