Search code examples
asp.net-mvc-3razordata-annotationseditortemplatesmodelmetadata

ASP.NET MVC 3 Data Attributes - Programmatically Set UIHint from Controller


If i have a ViewModel like this:

public class SignupViewModel
{
   [Required]
   [DisplayName("Email:")]
   public string EmailAddress { get; set; }   
}

And use EditorFor to render out the form fields:

@Html.EditorFor(model => model.EmailAddress )

It will render <input type="text">. Cool.

But in this particular scenario, i have already retrieved Email from a different source, and i wish to pre-fill the form with this data, and show a label instead of a textbox (as i don't want them to change their email - don't worry about why).

I know i can use [UIHint], but can i do that programatically from the controller?

E.g:

var model = new SignupViewModel();
model.EmailAddress = GetFromMysterySource(); // How do i set a UIHint?

What's the best way to approach this? Should i use a seperate ViewModel altogether, which could mean changing my View from being strongly-typed to being dynamic, or should i not use EditorFor, or should i use a custom editor template?

Suggestions/advise would be greatly appreciated.


Solution

  • You can't apply an attribute at runtime. My suggestion would be to build a bit of logic into your view to control how the view renders the data. You may need to augment your model to indicate to the view which display to choose.

      @if (Model.EmailAddressIsFixed)
      {
         @Html.DisplayFor( m => m.EmailAddress )
         @Html.HiddenFor( m => m.EmailAddress ) // only if you need it to post back
      }
      else
      {
         @Html.EditorFor( m => m.EmailAddress )
      }
    

    If you are doing this in more than one place, then a custom editor template doing the same thing would probably be in order.

      @Html.EditorFor( m => m.EmailAddress, 
                       "FixedAddressTemplate",
                       new { Fixed = Model.EmailAddressIsFixed } )