【问题标题】:How to capitalize first letter razor如何将第一个字母大写
【发布时间】:2012-10-03 16:33:44
【问题描述】:

我是 MVC 新手,还没有在线找到解决方案。

我的 html 为:

@Html.DisplayFor(model => model.Address1) <br />

我希望 address1 的所有第一个字母都是大写字母,例如某事路而不是某事路。

现在我有一个类客户端和属性 Address1 并使用 EF 获取地址如下:

 public class MyDBContext : DbContext
    {
        public DbSet<Client> Clients { get; set; }
    }

希望它有意义。

【问题讨论】:

  • 我明白,但在 MVC 中,正如我所说,我不能在 html 和属性本身中执行此操作......因为我的值来自带有 dbcontext 的 db
  • @Sam1 使用包装类 - 包装模型的视图模型。
  • @dbaseman 你能发一个例子吗

标签: asp.net-mvc asp.net-mvc-3 razor capitalization


【解决方案1】:

简单的解决方案可能是

Html.EditorFor(model => model.FirstName, new { htmlAttributes = new { class = "form-control" } })

然后使用下面的 css 将你的第一个字母大写然后你就完成了。

.form-control {
text-transform:capitalize;
}

【讨论】:

  • 我不知道为什么会如此落后。为什么每个人都试图处理视图模型的样式问题?
  • 这个解决方案非常简单
【解决方案2】:

您可以为Client 添加一个部分类,其属性在标题大小写中返回Address1

public partial class Client
{
    public string TitleCaseAddress1
    {
        get
        {
            return System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(this.Address1);
        }
    }
}

然后您将在 Razor 中使用 TitleCaseAddress1

@Html.DisplayFor(model =&gt; model.TitleCaseAddress1) &lt;br /&gt;

参考:http://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase(v=vs.100).aspx

【讨论】:

    【解决方案3】:

    最好将表示层和数据访问层分开。创建一个封装或翻译 ORM/实体框架对象的视图模型。

    public class ClientViewModel
    {
        private Client _dao;
    
        public ClientViewModel(Client dao)
        {
            _dao = dao;
        }
    
        public string Address 
        { 
            get
            {
                // modify the address as needed here
                return _dao.Address;
            }
        }
    }
    

    【讨论】:

    • 如果我这样做是否意味着我可以验证我的所有属性...说我的属性之一是空字符串并且在 html 输出中不想显示这可能吗?跨度>
    • @Sam1 我看到了你的另一个问题——这确实是视图的问题,但是是的,你应该能够做到这一点。
    • 嗨,已经这样做了,那么我现在如何在我的视图中调用地址?
    • @Sam1 同理,@Html.DisplayFrom(model =&gt; model.Address)。使用 Robuust 的答案来格式化字符串。
    【解决方案4】:

    对于希望在 Razor 中严格执行此操作的任何人,此示例正在转换登录的用户名。替换为您的字符串变量。

    获取首字母并转换为大写:

    @(@User.Identity.GetUserName().ToString().Substring(0, 1).ToUpper())
    

    这会得到剩余的字符串。

    @(@User.Identity.GetUserName().ToString().Substring(1, 
        User.Identity.GetUserName().ToString().Length - 1))
    

    只要把它们放在一起就可以得到整个字符串。

    @(@User.Identity.GetUserName().ToString().Substring(0, 
        1).ToUpper())@(@User.Identity.GetUserName().ToString().Substring(1, 
        User.Identity.GetUserName().ToString().Length - 1))
    

    【讨论】:

      【解决方案5】:

      这是实现您想要的正确方法,我已经为您实现了。

      有一个HtmlStringFormatter.Create() 允许您传递委托并制作自己的匿名格式化程序。

      代码示例:

      // This just upper case all the letters.
      @Html.DisplayFormatFor(model => model.Address, HtmlStringFormatter.Create(s=> s.ToUpper()))
      

      如果您要创建自定义格式化程序,请从 HtmlStringFormatter 派生并将其委托属性设置为您想要执行的任何操作。

      代码示例:

      // Here I use the Capital Letter custom formatter.
      @Html.DisplayFormatFor(model => model.Address, new CapitalLetterFormatter())
      

      所有类:

      namespace MvcPlay.HelperExtensions
      {
          public static class HelperExtensions
          {
              public static MvcHtmlString DisplayFormatFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, HtmlStringFormatter formatter)
              {
                  var output = helper.DisplayFor(expression);
                  string formatted = formatter.Delegate.Invoke(output.ToString());
                  return MvcHtmlString.Create(formatted);
              }
          }
      }
      
      namespace MvcPlay.HtmlStringFormatting
      {
          public class HtmlStringFormatter
          {
              public delegate string FormatDelegate(string s);
      
              public FormatDelegate Delegate;
              public Expression<FormatDelegate> formatExpression;
      
              private HtmlStringFormatter(FormatDelegate expression)
              {
                  Delegate = expression;
              }
      
              protected HtmlStringFormatter()
              {
      
              }
      
              public static HtmlStringFormatter Create(FormatDelegate expression)
              {
                  return new HtmlStringFormatter(expression);
              }
          }
      
          public class CapitalLetterFormatter : HtmlStringFormatter
          {
              public CapitalLetterFormatter()
              {
                  Delegate =
                      s => new CultureInfo("en-US", false).TextInfo.ToTitleCase(s).ToString(CultureInfo.InvariantCulture);
      
              }
          }
      }
      

      不要忘记将以下行添加到 Web.Config 的 Views 文件夹中:

      <add namespace="MvcPlay.HelperExtensions" />
      <add namespace="MvcPlay.HtmlStringFormatting"/>
      

      这将自动包含格式化程序和帮助程序扩展,因此您无需将其包含在要使用它的每个视图中。

      【讨论】:

      • 没有意见?无论如何,看看我的解决方案 - 它的可重用性更高,并且每次您想以不同的方式显示数据时都不需要创建 ViewModel。
      【解决方案6】:

      您可以为此使用 C# 代码:示例来自:http://www.dotnetperls.com/uppercase-first-letter

      using System;
      
      class Program
      {
          static void Main()
          {
          Console.WriteLine(UppercaseFirst("samuel"));
          Console.WriteLine(UppercaseFirst("julia"));
          Console.WriteLine(UppercaseFirst("john smith"));
          }
      
          static string UppercaseFirst(string s)
          {
          // Check for empty string.
          if (string.IsNullOrEmpty(s))
          {
              return string.Empty;
          }
          // Return char and concat substring.
          return char.ToUpper(s[0]) + s.Substring(1);
          }
      }
      

      【讨论】:

      • 我将如何使用 MVC 做到这一点?
      • 在 MVC 中可以添加 c# 代码块。您是否已经了解 MVC 项目或 .NET aspx 的基础知识? - 我这里没有可用的 VS2010,所以我无法立即创建您的代码。我明天可以,如果没有人在我之前做到这一点。或者,如果那时您自己还没有找到解决方案。
      • 我可以等到明天,因为我说是 mvc 新手,有使用 asp.net 的经验
      • 在 Razor 中运行良好:@char.ToUpper(s[0])s.Substring(1)
      【解决方案7】:

      只需按如下方式使用

      @System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(sampleText)
      

      【讨论】:

        【解决方案8】:

        我知道最初的问题是指将整个字符串中的每个单词都大写。但是,我来到这里试图找到一种将字符串的第一个字母大写的解决方案。我同意 kiflay 的回答作为 OP 的最佳解决方案。但是,在我的用法中,将其扩展为仅修改第一个字母。

        CSS:

        blockquote::first-letter {
        text-transform: capitalize;}
        

        【讨论】:

          【解决方案9】:

          将 Bootstrap 4.x 与 Razor 一起使用,您可以使用 CSS 将第一个字母大写:

          <p class="text-capitalize">CapiTaliZed text.</p>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-09-01
            • 2017-07-12
            • 2022-01-09
            • 2023-03-15
            • 2010-09-16
            • 1970-01-01
            相关资源
            最近更新 更多