开发者

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, an开发者_运维技巧d 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.


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 } )
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜