2010-01-12 5 views
8

Tôi có dự án ASPNET MVC 2. Khi tôi sử dụngTextBoxĐể hiển thị cho HTML có tiền tố trên thuộc tính ID

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

các TexBoxFor sẽ làm như

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

Dòng trong mô hình là

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

Tôi có thể làm idtên thuộc tính với một số tiền tố? Giống như

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

Xin cảm ơn tất cả.

Trả lời

13

Dường như MVC 2 RTM hiện không cung cấp tính năng này. Bạn có thể thử các phương pháp mở rộng sau:

   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); 
    } 
+1

bạn là một huyền thoại. – ajbeaven

+0

Tôi cần điều này bởi vì tôi cần tiền tố đặt trên một số đối tượng nhưng không phải là các đối tượng khác. – Chris

6

Bạn luôn có thể đặt htmlAttributes, mặc dù đây không phải là cách sạch nhất để thực hiện.
Và, bạn sẽ phải làm điều đó trong tất cả những người giúp đỡ của bạn.

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

Có ai thực sự xác minh nếu điều này hoạt động không? Bởi vì tôi không nghĩ vậy. Tôi không nghĩ rằng bạn có thể đặt tên hoặc tài sản id bằng cách sử dụng đối tượng ẩn danh bằng cách sử dụng được xây dựng trong HtmlHelper vì nó kết hợp các giá trị của nó trên đầu trang htmlAttributes đối tượng của bạn. Tôi đã tạo một số người trợ giúp tùy chỉnh để sử dụng cho riêng mình, nơi tôi sắp xếp lại cách sử dụng để nếu tôi muốn tôi có thể làm những gì bạn đã nói ở đây. –

+0

Thuộc tính 'id' có thể được thay đổi nhưng 'tên' không thể. 'Tên' bị ghi đè. Vấn đề sẽ là LabelFor, ValidationMessageFor và TextBoxFor (một ví dụ) sẽ không đồng bộ nếu trường id thay đổi không nhất quán, vì vậy các phương thức mở rộng là cách để đi. –

0

Có giải pháp khác nhau cho cùng một vấn đề .. tôi đã tạo ra một dự án thử nghiệm MVC mới và sao chép web.config toàn bộ quan điểm của cho dự án cũ, nơi tôi đã nhận được lỗi này, giải quyết