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

时间:2010-10-08 01:04:51

标签: c# .net asp.net-mvc

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

<%: Html.TextBoxFor(model => model.Loan.InterestRate) %>

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

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

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

<%: Html.TextBox("Loan.InterestRate", Model.Loan.InterestRate == 0 ? 
    (decimal?)null : Model.Loan.InterestRate) %>

8 个答案:

答案 0 :(得分:50)

在模型中添加DisplayFormat属性

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

查看

@Html.TextBoxFor(model => model.InterestRate)

此输出为空而不是0。 更多格式示例here

<强>更新

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

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

更新2

它适用于TextBoxFor这样:

@Html.TextBoxFor(model => model.InterestRate, "{0:#.#}")

答案 1 :(得分:41)

我使用这个解决方案:

   @Html.TextBoxFor(model => model.Year, new { Value = "" })

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

答案 2 :(得分:14)

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

我将这个用于Int's。它名为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)%>

答案 3 :(得分:11)

另一个可能是检查值

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

答案 4 :(得分:4)

“”而不是null。

    <%: Html.TextBox("Loan.InterestRate", 
Model.Loan.InterestRate == 0 ?     "" : Model.Loan.InterestRate) %>

为什么不贷款。利率可以为空?

<%: Html.TextBox("Loan.InterestRate", Model.Loan.InterestRate ?? "") %>

答案 5 :(得分:4)

另一种解决方案是在页面加载时使用jQuery将空字符串替换为零。 选择任何名称作为所有输入字段的类名,这些字段应填充空字符串而不是零。例如,非零数。

@Html.TextBoxFor(model => model.InterestRate, new { @class = "non-zero-num" }) 

在页面上添加以下脚本:

<script>
    $(document).ready(function(){
        $(".non-zero-num").val($(this).val() == 0 ? '' : $(this).val());
    })
</script>

答案 6 :(得分:0)

我认为@jfar的答案指向正确的方向,但Int32.ascx应该是这个

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Int32>" %>
<%
    string displayText;

    if (Model == 0)
    {
        displayText = "";
    }
    else
    {
        displayText = Model.ToString();
    }

%>  

<%= Html.TextBox("", displayText)%>

或使用Razor更新答案(/Shared/EditorTemplates/Int32.cshtml)

@model Int32
@{
    string text = Model == 0 ? "" : Model.ToString();
}
@Html.TextBox("", text)

答案 7 :(得分:0)

您可以这样做:(VB代码)

这是核心:

@IIf(Model.YourNumericValue = 0, "", Model.YourNumericValue)

以下是使用HTML呈现文本框

<input type="text" name="sYourTextboxName"  value="@IIf(Model.YourNumericValue= 0, "", Model.YourNumericValue))">

以下是使用HTML帮助器呈现文本框

 @Html.TextBox("sYourTextboxName", IIf(Model.YourNumericValue= 0, "", Model.YourNumericValue))

IIf是一个非常方便的单行功能 - 它的工作方式是这个。

IIf(Expression, TruePart, FalsePart)

所以基本上你说 - 如果我的参数= 0 - 我想什么都不输出,String.Empty,Null,“” - 对于错误的部分 - 它就像 - 哦,如果我的参数不等于0 - 那么必须是0以外的其他东西 - 所以我将输出我的数值而不必担心零将在文本框中。

或者你想要构建它。

希望有所帮助!