【问题标题】:How to force uppercase on a Html.TextboxFor如何在 Html.TextboxFor 上强制大写
【发布时间】:2011-11-06 10:12:24
【问题描述】:

在我看来,我想在文本框上强制大写。因此,当用户在文本框中键入内容时,文本会立即转换为大写,或者(另一种方法)在提交表单并且模型填充数据(在动作控制器中)时将文本转换为大写。也许有一些 CSS 或 jquery 解决方案,但我更喜欢一些 MVC 解决方案(如果可能的话)。

这是我的看法:

@model Domain.Entities.ProjectTechnology

<script src="../../Scripts/Admin/_AddProjectTechnology.js" type="text/javascript"></script>

<div class="editor-label">Technologies</div>    

<div class="editor-field">

    @using (Ajax.BeginForm("_AddProjectTechnology", new AjaxOptions { HttpMethod = "POST",
                                                                  UpdateTargetId = "RemoveProjectTechnology",
                                                                  InsertionMode = InsertionMode.Replace,
                                                                  OnComplete = "AddProjectTechnologyCompleted" })) {    
        @Html.ValidationSummary(true)
        @Html.HiddenFor(m => m.ProjectID)
        @Html.EditorFor(m => m.TechnologyID)
        @Html.ValidationMessageFor(m => m.TechnologyID)          
    }
</div>

这是我的模型:

public class ProjectTechnology
{
    public int     ProjectID   { get; set; }
    public string  TechnologyID    { get; set; }
}

有问题的文本框是这一行:@Html.EditorFor(m => m.TechnologyID)

我该如何继续?

谢谢。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    另见:

    @Html.EditorFor(m => m.TechnologyID, 
          new { @class = "whatever-class",  
          @style = "text-transform:uppercase"})
    

    【讨论】:

    • 欢迎来到 SO :-)。为了改进您的答案,您应该添加一些解释。
    • 欢迎来到 SOF。通过呈现 text-transform:uppercase 样式很好地解释了您的答案。
    【解决方案2】:

    最简单的方法是 IMO:

    @Html.EditorFor(m => m.TechnologyID, new { htmlAttributes = new { @style = "text-transform:uppercase" } })
    

    【讨论】:

    • text-transform 只会将外观更改为大写字母。您必须在服务器端手动转换为大写。
    • @Hemal true,最好在客户端和服务器上都解决这个问题。
    • 您也可以在客户端使用toUpperCase()
    【解决方案3】:

    我查看了在我的模型中更改我的 getter 和 setter,但在我的情况下,我首先使用 DB,所以如果我对我的 db 结构进行更改,我每次都必须放回 getter 和 setter 代码。这对我们来说将来很难管理。

    我试过了;

    @Html.EditorFor(m => m.Lname, 
      new { @class = "whatever-class",  
      @style = "text-transform:uppercase"})
    

    但如上所述,这只会使它成为视图的资本。当您将其保存到数据库时,数据会以用户输入的方式显示。(GIGO)对于我们的网站,我也需要它在数据库中为大写。所以我为解决这个问题所做的就是将我的对象的属性与 .upper() 一起设置为它自己,在 post action 方法 Ex:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "Recid,FName,LName")] UserModel change)
        {
            change.LName = change.LName.ToUpper();
            change.FName = change.FName.ToUpper();
            .... //code to update table
        }
    

    所以结合前端的 CSS 样式并在帖子中设置属性我在前端和后端都有大写。

    【讨论】:

      【解决方案4】:

      我在视图中的代码行是:

      @Html.TextBoxFor(model => model.BldgNameAbbv, new {onkeyup="InputToUpper(this);"})
      

      相关的脚本是:

      <script>
      function InputToUpper(obj)
      {
          if (obj.value!="")
          {
          obj.value = obj.value.toUpperCase();
          }
      }
      </script>
      

      这对我有用。并且使用 TextBoxFor,而不是 EditorFor,是必不可少的。

      【讨论】:

      • 旧答案,但不要这样做,因为它会重置插入符号(用户的输入位置),如果您尝试编辑值,这真的很讨厌。
      【解决方案5】:

      您可以在属性的 getter 上执行此转换:

      public class ProjectTechnology
      {
          public int ProjectID { get; set; }
      
          private string _technologyId;
          public string TechnologyID 
          {
              get 
              {
                  if (string.IsNullOrEmpty(_technologyId))
                  {
                      return _technologyId;
                  }
                  return _technologyId.ToUpper();
              }
              set
              {
                  _technologyId = value;
              }
          }
      }
      

      【讨论】:

      • 感谢您的回复。我在另一篇文章中看到了这个解决方案,但我对此并不满意,因为我认为这个解决方案使我的模型复杂化,你不觉得吗?模型中的 [DisplayFormat(ApplyFormatInEditMode=true, ... 怎么样?但我不知道我们是否可以通过这种方式强制大写?还是谢谢。
      • @Bronzato,您可以使用 CSS 在客户端强制大写,但用户代理将发布实际的小写值。因此,如果仅出于视觉目的,CSS 是一种可能性,但如果您想要实际具有大写值,则需要在某处手动执行此转换。您可以使用 DisplayFormat 但这仅对在客户端上显示值有用。当用户输入一些新字符时,它们将是小写的,而在提交表单时,您将得到小写。
      • 如果大写是业务规则,那么我只会在集合中使用 ToUpper。
      • @PauloAbreu,我们在这里讨论的是视图模型。对@Bronzato? ProjectTechnology 不是传递给您的域逻辑的任何东西吗?它是专为给定视图设计的视图模型。当我们将此视图模型映射回映射层中的原始域模型时,getter 将不会出现问题。
      • Darin 我不太确定,因为@Bronzato 声明了模型 Domain.Entities.ProjectTechnology,无论如何,正如我所说...如果这是一个业务规则:它将存储正确的值,我们通常get 比 set 多。
      【解决方案6】:

      对于编辑器对于:

      @Html.EditorFor(model => 
          model.Nome, 
          new { 
              htmlAttributes = new { 
                  @class = "form-control", 
                  @onkeyup = "InputToUpper(this);"
              } 
          }
      )
      

      【讨论】:

      • 是的。这是外面美好的一天,鸟儿在歌唱,婴儿在笑。多亏了这个答案,我的世界一切都很好。我的意思是,谁用小写保存州缩写?
      【解决方案7】:

      如果您想简单地防止以小写形式保存到数据库,那么最直接的选择是在创建和编辑操作的 HttpPost 期间将值更改为大写 例如

      [HttpPost]
      [ValidateAntiForgeryToken]
      public async Task<IActionResult> Create([Bind("ProjectID, TechnologyID ")] ProjectTechnology projectTechnology)
          {
              ProjectTechnology.TechnologyID = ProjectTechnology.TechnologyID.ToUpper();
      
              if (ModelState.IsValid)
              {
                  _context.Add(person);
                  await _context.SaveChangesAsync();
      

      【讨论】:

      • 这也有效,我也实现了@leifbattermann 答案。
      【解决方案8】:

      您可以使用text-transform: uppercaase css 属性。如果你想从 mvc 做这个,你可以尝试为文本框创建模板(在那里你用 css 类为大写输出输入)并在模型中使用 UIHint 属性。希望对您有所帮助。

      【讨论】:

      • 文本转换只会将外观更改为大写字母。您必须在服务器端手动转换为大写
      猜你喜欢
      • 2013-04-04
      • 2019-11-08
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 2020-11-16
      相关资源
      最近更新 更多