web-dev-qa-db-fra.com

Html.TextboxFor valeur par défaut pour Integer/Decimal soit vide au lieu de

J'utilise la syntaxe par défaut asp.net MVC 2 pour construire les zones de texte qui sont des nombres entiers ou décimaux pour mon application web asp.net MVC:

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

assez simple, mais le problème tient au fait que mes objets de modèle de liaison sont décimaux ou int et ne peuvent pas être null, ils affichent leur valeur sous la forme zéro (0) lors du chargement de la page si mon modèle est vide (comme dans le mode ajout Modèle CRUD) et zéro est une valeur incorrecte et est également invalide pour la validation de ma page.

Comment pourrais-je avoir des zones de texte qui n'ont pas de valeur de départ, juste une zone de texte vide, je comprends que zéro est une valeur potentielle, mais j'accepte uniquement les valeurs supérieures à zéro de toute façon, ce n'est donc pas un problème pour moi.

J'ai même essayé de transtyper en tant que décimale nullable et également non assistée (ce qui n'est pas idéal), mais hélas, je reçois toujours la valeur par défaut «0». des idées??

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

Vous pouvez remplacer le modèle par défaut en plaçant un modèle personnalisé dans/Shared/EditorTemplates ou par contrôleur dans/ControllerName/EditorTemplates.

J'utilise celui-ci pour Int. Son nommé 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)%>
14
John Farrell

Dans votre modèle, ajoutez l'attribut DisplayFormat

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

Vue

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

Cela génère des valeurs vides au lieu de 0. Autres exemples de formats ici

Mettre à jour

TextBoxFor ne fonctionne pas avec le format, mais EditorFor ne:

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

Mise à jour 2

Cela fonctionne pour TextBoxFor de cette façon:

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

J'utilise cette solution:

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

se référer à: https://stackoverflow.com/a/6186576/297487

41
Khosro

Un autre pourrait être de vérifier la valeur

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

Qu'en est-il de "" au lieu de null.

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

Aussi, pourquoi le taux d'intérêt Loan.Intest n'est-il pas nul?

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

Une autre solution consiste à utiliser jQuery pour remplacer les zéros par une chaîne vide lors du chargement de la page . Choisissez un nom à utiliser comme nom de classe pour tous les champs d'entrée qui doivent être renseignés avec une chaîne vide au lieu de zéro. Par exemple, non-zéro-num.

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

Et ajoutez le script suivant sur votre page:

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

Je pense que la réponse de @ jfar va dans la bonne direction mais que Int32.ascx devrait être comme ça

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

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

%>  

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

ou une réponse mise à jour à l'aide de Razor (/Shared/EditorTemplates/Int32.cshtml)

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