2010-10-08 13 views
45

estoy usando la sintaxis predeterminada asp.net MVC 2 para construir cuadro de texto de que son número entero o decimal para mi asp.net MVC aplicación web:Html.TextboxFor/decimales que se vacía en lugar de 0

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

bastante sencillo, pero el problema es intrínsecamente al hecho de que mis objetos de modelo de enlace son decimales o int y no aceptan nulos, imprimen su valor como cero (0) en la carga de la página si mi modelo está vacío (como agregar modo para una plantilla CRUD) y cero es un valor incorrecto y tampoco es válido para la validación de mi página.

Cómo puedo tener cuadros de texto que no tienen valor de inicio, solo un cuadro de texto vacío, comprendo que cero es un valor potencial, pero de todos modos acepto valores mayores que cero, así que esto no es un problema para mí.

Incluso probé el casting como decimal con nulos y también como no ayudante (lo que no es ideal), pero lamentablemente sigo recibiendo el valor '0' predeterminado. ¿¿algunas ideas??

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

Respuesta

12

Puede reemplazar la plantilla predeterminada, poniendo una plantilla personalizada en/shared/EditorTemplates o por el controlador en/nombrecontrolador/EditorTemplates.

Utilizo este para Int. Su nombre 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)%> 
+0

Gracias interesantes. Intentará. – GONeale

+3

no estoy seguro de por qué esta es la respuesta aceptada, ya que siempre mostrará el valor del número entero, el Modelo es un (no se puede aceptar nulos) int –

4

¿Qué pasa con "" en lugar de null.

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

¿Por qué isnt Loan.InterestRate nullable?

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

Um porque no quiero que lo sea. Intentará cadena vacía. – GONeale

+1

De todos modos, no se compilará porque la cadena y el decimal son tipos de datos diferentes. "Sin conversión implícita entre cadena y decimal". – GONeale

+2

así que ponga un .ToString() al final del decimal. Es una buena sugerencia – BritishDeveloper

4

Una solución alternativa es utilizar jQuery para reemplazar ceros con la cadena vacía cuando se carga la página. Elija cualquier nombre para usar como nombre de clase para todos los campos de entrada que deben rellenarse con cadena vacía en lugar de cero. Por ejemplo, no cero-num.

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

y agregue el siguiente script en su página:

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

¿Y para aquellos usuarios que no tienen javascript habilitado? Lo mejor es solo agregar mejoras visuales con javascript. –

+1

Hola Sam. Actualmente, Javascript se considera no solo un medio de mejora visual de la interfaz de usuario, sino que también en muchas (y puedo decir en la mayoría de las aplicaciones modernas basadas en la web), se utiliza para implementar la lógica comercial. Solo por nombrar algunas, las aplicaciones de Google como mapas, documentos y gmail se encuentran entre ellas. – Majix

+0

Es muy interesante que [Jeff Atwood] (http://en.wikipedia.org/wiki/Jeff_Atwood), uno de los cofundadores de este mismo sitio web, stackoverflow, haya propuesto algo en esta línea. Cito de la Wikipedia: "También se le atribuye la propuesta de Atwood's Law, que es un corolario del principio de diseño de la regla de mínimo poder. Establece que cualquier aplicación que se escriba en JavaScript se escribirá finalmente en JavaScript". – Majix

0

creo @ puntos de respuesta de jfar en la dirección correcta, pero el Int32.ascx debe estar presente

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

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

%> 

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

o actualizados responder usando Razor (/ Shared/EditorTemplates/Int32.cshtml)

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

Otra podría ser para comprobar el valor

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

Esto provoca que la etiqueta tenga dos valores en el HTML. Su comportamiento puede cambiar en futuros navegadores. – Jeff

39

que utilizan esta solución:

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

se refieren a: https://stackoverflow.com/a/6186576/297487

+12

. Debe notarse que esto no funciona bien cuando se usa con la validación MVC típica del lado del servidor donde usted vuelve a mostrar la vista con los errores de validación (Ej; 'if (! ModelState.IsValid) return View (viewmodel)'). Cada vez que el cuadro de texto se represente al cargar la página, se mostrará una cadena vacía. Esto es ideal para la primera visualización habitual de la página, pero es malo cuando el usuario regresa debido a una falla de validación. Cualquier dato que ingresen en los campos se perderá y se reemplazará con la cadena vacía. – EF0

+4

@EFO entonces puede usar 'Value = (Model.Loan.InterestRate> 0? Model.Loan.InterestRate.ToString():" ")' – devqon

37

En su modelo de añadir el atributo formatSalida

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

Ver

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

Esto genera vacío en lugar de 0. Los ejemplos Más formato here

Actualizar

TextBoxFor does`s no funciona con el formato, pero EditorFor hace:

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

Actualización 2

Se trabaja para TextBoxFor esta manera:

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

Me gusta esto de la mejor manera, aprovechar las tecnologías existentes de la manera en que están destinadas a ser usado. Todos los demás usan algún tipo de truco en la vista o operadores ternarios o controles del lado del cliente. Esto es limpio y proporciona otros buenos ejemplos. – akousmata

+1

Esto no funcionó para mí. ¿Funcionó para alguien más? – JoshYates1980

+0

Intente utilizar Html.EditorFor en lugar de Html.TextBoxFor – Sel

0

Aquí es lo que puede hacer: (Código de VB)

Este es el núcleo:

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

Aquí está si utiliza el código HTML para representar su cuadro de texto

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

aquí es que si se utiliza asistente de HTML para hacer que TEXTBOX

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

SiInm es una característica de una línea muy práctico - la forma en que funciona es la siguiente.

IIf(Expression, TruePart, FalsePart) 

Así que básicamente diciendo - si mi Parámetro = 0 - Quiero nada de salida, String.Empty, Null, "" - y para la parte falsa - es como - oh si mi parámetro no es igual a 0 - entonces eso debe ser algo distinto de 0 - entonces daré salida a mi valor numérico sin preocuparme de que el cero esté en el cuadro de texto.

O como quiera estructurarlo.

Espero que haya ayudado!

Cuestiones relacionadas