Html.Textbox为Integer/Decimal的默认值为Empty而不是0

GON*_*ale 52 .net c# asp.net-mvc

我使用默认的asp.net MVC 2语法来构造我的asp.net MVC Web应用程序的整数或十进制TextBox:

<%: Html.TextBoxFor(model => model.Loan.InterestRate) %>
Run Code Online (Sandbox Code Playgroud)

非常简单,但问题本质上是我的绑定模型对象是十进制或int和不可空的事实,如果我的模型是空的,它们在页面加载时将它们的值打印为零(0)(例如在添加模式中为CRUD模板)和零值不正确,对我的页面验证也无效.

我怎么能有没有起始值的文本框,只是一个空的文本框,我知道零是一个潜在的值,但我只接受大于零的值,所以这对我来说不是问题.

我甚至尝试将其作为可以为空的十进制进行投射,也尝试使用非助手(这并不理想),但是,我仍然接收默认的"0"值.有任何想法吗??

<%: Html.TextBox("Loan.InterestRate", Model.Loan.InterestRate == 0 ? 
    (decimal?)null : Model.Loan.InterestRate) %>
Run Code Online (Sandbox Code Playgroud)

Sel*_*Sel 55

在您的模型中添加DisplayFormat属性

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:#.#}")]  
decimal  InterestRate { get; set; }
Run Code Online (Sandbox Code Playgroud)

视图

@Html.TextBoxFor(model => model.InterestRate)
Run Code Online (Sandbox Code Playgroud)

这输出空而不是0. 这里有更多格式示例

更新

TextBoxFor不适用于格式,但EditorFor可以:

@Html.EditorFor(model => model.InterestRate)
Run Code Online (Sandbox Code Playgroud)

更新2

它适用于TextBoxFor这样:

@Html.TextBoxFor(model => model.InterestRate, "{0:#.#}")
Run Code Online (Sandbox Code Playgroud)

  • 我最喜欢这个,利用现有技术的方式.所有其他人在视图或三元运算符或客户端检查中使用某种黑客.这很干净,并提供了其他很好的例子. (9认同)

Kho*_*sro 41

我使用这个解决方案:

   @Html.TextBoxFor(model => model.Year, new { Value = "" })
Run Code Online (Sandbox Code Playgroud)

请参阅:https://stackoverflow.com/a/6186576/297487

  • 应该注意的是,当与典型的MVC服务器端验证一起使用时,这种方法效果不佳,您可以使用验证错误重新显示视图(例如,`if(!ModelState.IsValid)返回View(viewmodel)`).无论何时在页面加载时呈现文本框,它都将显示一个空字符串.这对于常规的首次呈现页面非常有用,但是当用户由于验证失败而返回时会很糟糕.无论他们在字段中输入的数据都将丢失并替换为空字符串. (13认同)
  • @EFO然后你可以使用`Value =(Model.Loan.InterestRate> 0?Model.Loan.InterestRate.ToString():"")` (4认同)

Joh*_*ell 14

您可以通过将自定义模板放在/ Shared/EditorTemplates中或通过/ ControllerName/EditorTemplates中的控制器来覆盖默认模板.

我用这个用于Int.它的名字叫Int32.ascx:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<%@ Import Namespace="System.Web.Mvc.Html" %>
<%
    string displayText = string.Empty;

    if (Model != null)
    {
        displayText = Model.ToString();
    }

%>

<%= Html.TextBox("", displayText)%>
Run Code Online (Sandbox Code Playgroud)

  • 不知道为什么这是接受的答案,因为它将始终显示整数的值,模型是一个(不可为空)int (6认同)

San*_*eep 11

另一个可能是检查价值

@Html.TextBoxFor
(m => m.CertificateID, new { @Value = (Model.CertificateID > 0 ?Model.CertificateID.ToString() :string.Empty) })
Run Code Online (Sandbox Code Playgroud)