3

如何在我的 ASP.Net MVC 应用程序中针对我的业务对象提供某种形式的属性,以便我可以在视图中获取帮助文本并将它们显示为弹出悬停帮助文本,如下所示:

<%= Html.TextBox("PostalCode", Model.PostalCode, new { 
    title = "Please enter your postal code." })%>

我希望能够从我的 ViewModel 中获取“标题”值,该值将从业务对象的属性中获取文本。

总之,如何在我的业务对象上应用帮助文本属性/元数据?

4

4 回答 4

2

这是我的做法:

  1. 创建新属性如下:

    public class HelpPromptAttribute : Attribute
    {
      public HelpPromptAttribute(string text)
      {
          myproperty = text; 
      }
      protected string myproperty;
    
      public string HelpTextKey
      {
          get { return myproperty; }
          set { myproperty = value; }
      }
    }
    
  2. 向实体属性添加了如下属性:

    [HelpPrompt("ProjectDescription")]
    [Required(ErrorMessageResourceName = "ProjectDescriptionRequired", ErrorMessageResourceType = typeof(EntityValidationMessages))]
    [StringLength(50, ErrorMessageResourceName = "ProjectDescriptionTooLong", ErrorMessageResourceType = typeof(EntityValidationMessages))]
    public string ProjectDescription { get; set; }
    
  3. 为实体添加了扩展方法,如下所示:

    public static class EntityBOExtensions
    {
      public static string PropertyHelp(this object objectBO, string PropertyName)
      {
          Type type = objectBO.GetType();
    
    
          foreach (PropertyInfo pInfo in type.GetProperties())
          {
              if (string.Compare(pInfo.Name, PropertyName) == 0)
              {
                  foreach (Attribute attr in Attribute.GetCustomAttributes(pInfo))
                  {
                      if (attr.GetType() == typeof(HelpPromptAttribute))
                      {
                          string key = ((HelpPromptAttribute)attr).HelpTextKey;
                          if (!string.IsNullOrEmpty(key))
                              return EntityBOHelp.ResourceManager.GetString(key);
                      }
                  }
              }
          }
          return null;
      }
    }
    
  4. 添加了一个 HtmlHelper(简单)如下:

    public static string LocalisedTextBoxWithHelp(this HtmlHelper helper, string name, object value, string helptext)
    {
        string textbox = helper.TextBox(name, value, new { helpprompt = helptext });
        return textbox;
    }
    
  5. 最后在视图中使用了以下标记:

     <%= Html.LocalisedTextBoxWithHelp("project.ProjectDescription", Model.ProjectDescription, Model.PropertyHelp("ProjectDescription"))%>
    

尽管需要改进,但这可以完成工作。;)

于 2009-10-01T17:55:01.920 回答
1

更新:

您可以为每个名为“Title”或“Hint”的对象创建一个新的类属性,并向它们添加适当的字符串值。然后使用 MyObject.Title 获取该属性


有趣的问题。我想看到使用属性的答案,但这里有两种我能想到的方法:

向您的对象添加扩展方法 这将需要大量重复的代码。

public static string GetTitle(this YourObject obj)
{
     return "Title for object";
}

Html Helper 扩展方法

您将在此辅助方法中存储对象标题。

public static string GetObjectTitle(this HtmlHelper html, string type)
{
     switch(type)
     {
          case "Object1":
          return "Title for object 1";
          break;

          case "Object2":
          return "Title for object 2";
          break;

          default:
          return "No titled specified for this object type";
          break;
     }
}

要调用此方法:

<%= Html.GetObjectTitle(Model.GetType()) %>

或者在您的示例中:

<%= Html.TextBox("PostalCode", Model.PostalCode, new { 
watermark = "Postal Code", 
title = Html.GetObjectTitle(Model.GetType()) })%>

我更喜欢第二种方法,因为您可以存储所有标题,并且您需要编写更少的代码。

但是,我认为向类添加一个属性并创建一种获取该属性的方法会更好一些。

于 2009-10-01T01:11:33.693 回答
1

我认为没有办法直接开箱即用。

但是,您可以做的是创建一个通用的“模型值”类,该类将该信息封装在其中,从而保留您的强类型视图。IE:

ModelValue<string> postalCode = new ModelValue<string>("poscode value", "Please enter your postal code.")

然后,您可以构建模型类以包含 ModelValue 类型的属性。

您上面的代码将类似于:

<%= Html.TextBox("PostalCode", Model.PostalCode.Value, new {     watermark = "Postal Code",     title = Model.PostalCode.Title })%>

这样做的缺点是我不认为 mvc 会为你做自动绑定,所以你必须像这个例子一样在视图中自己做所有映射,但在 Post 上你也必须做如果您还没有手动装订。您可能还会在模型的构造函数中实例化所有 ModelValue 属性,然后从它们存储的位置提取所有标题值,因为您不会在 Post 上重新绑定它们(我正在考虑这里的验证错误导致表单成为重新显示)。

如果您非常热衷于将属性放在模型属性上,然后在呈现页面时以某种方式解析它们,但我不知道如果您想这样做,您将从哪里开始。

于 2009-10-01T01:16:44.790 回答
1

我知道这很旧,但我最近在一个 ASP.NET MVC3 项目中遇到了这个问题并实施了一个解决方案。

1.创建自定义属性来存储帮助文本

public class HelpTextAttribute : DescriptionAttribute
{
    public HelpTextAttribute(string helpText)
        : base(helpText)
    { }
}

2.创建一个HtmlHelper扩展方法来获取属性值

public static class HtmlHelperExtensions
{
    public static string HelpTextFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
        var memberExpression = expression.Body as MemberExpression;
        if (memberExpression == null)
            throw new InvalidOperationException("Expression must be a member expression");

        var attributes = memberExpression.Member.GetCustomAttributes(typeof(HelpTextAttribute), true);
        var attribute = attributes.Length > 0 ? attributes[0] as HelpTextAttribute : null;

        return html.Encode(attribute == null ? string.Empty : attribute.Description);
    }
}

3.用HelpText属性注释模型属性

[HelpText("A level from which to start")]
[Required("You must select a level")]
public int Level { get; set; }

4. 只需在视图中使用新的 HtmlHelper 扩展方法

<div class="editor-help">
    <%: Html.HelpTextFor(model => model.Level) %>
</div>
于 2011-09-28T06:43:37.793 回答