【问题标题】:ASP.NET MVC 3 Data Attributes - Programmatically Set UIHint from ControllerASP.NET MVC 3 数据属性 - 以编程方式从控制器设置 UIHint
【发布时间】:2011-07-29 14:23:56
【问题描述】:

如果我有这样的 ViewModel

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

并使用 EditorFor 渲染表单字段:

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

它将呈现<input type="text">。很酷。

但在这种特殊情况下,我已经从不同的来源检索到电子邮件,我希望用这些数据预填充表单,并显示一个标签而不是文本框(因为我不希望他们更改电子邮件 - 不用担心为什么)。

我知道我可以使用 [UIHint],但我可以通过控制器以编程方式执行此操作吗?

例如:

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

解决这个问题的最佳方法是什么?我应该完全使用单独的 ViewModel,这可能意味着将我的视图从强类型更改为 dynamic,或者我不应该使用 EditorFor,还是应该使用自定义编辑器模板?

建议/建议将不胜感激。

【问题讨论】:

    标签: asp.net-mvc-3 razor data-annotations editortemplates modelmetadata


    【解决方案1】:

    您不能在运行时应用属性。我的建议是在您的视图中构建一些逻辑来控制视图如何呈现数据。您可能需要扩充模型以向视图指示要选择的显示。

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

    如果您在多个地方执行此操作,那么执行相同操作的自定义编辑器模板可能是合适的。

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

    【讨论】:

    • 我将如何使用编辑器模板来做到这一点?因为EmailAddressIsFixedEmailAddress 之间没有关系。我可以创建一个嵌套视图模型,但是我将无法在父模型级别使用数据属性(例如[Required])。
    • @RPM - 您可以将额外数据传递给编辑器模板。 @Html.EditorFor( m => m.EmailAddress, new { Fixed = Model.EmailAddressIsFixed } )
    • @tvanfossen - 仍然无法在其上放置数据属性。我将[Required] 属性放在哪里?因为它不再是一个字段,例如public string EmailAddress { get; set; },它是一个类。而且我不能将属性放在内部类中的字段上,因为那样它就不能重用。
    • @RPM -- 不使用嵌套模型并在辅助方法中提供模板名称怎么样?
    • 是的,这是个好主意。好吧,你让我走上了正确的道路。接受,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多