2012-04-23 10 views
5

Dado que parece haber un límite de 1024 caracteres para los valores de entrada ocultos, ¿qué hacen todos los usuarios por valores superiores a este límite? ¿Se puede usar razonablemente una entrada de archivo oculto (< input type = "file" value = "algún valor muy largo" ...) en su lugar? ¿Cuáles serían las restricciones de longitud de campo de una solución de este tipo?Problema con entradas ocultas y valores muy grandes en HTML y ASP.NET MVC 3 Razor

<input id="someId" type="hidden" 
value="5538680,5538683,5538858,5539195,5540063,5540812,5540814,5541665,5541666,5541667, 
5541668,5541669,5541670,5541671,5541672,5541673,5541674,5541675,5541676,5541677,5541678, 
5541679,5541680,5541682,5541683,5541684,5541685,5541686,5541687,5541688,5541689,5541690, 
5541691,5541692,5541693,5541694,5541695,5541696,5541697,5541698,5541728,5543254,5543501, 
5543502,5543949,5543950,5544073,5544867,5545079,5545642,5545827,5545890,5545891,5545895, 
5545896,5546323,5546631,5546632,5546972,5547794,5547900,5547945,5547980,554923...735181, 
5735182,5735183,5735184,5735185,5735187,5735188,5735189,5735227,5735228,5735229,5735235, 
5735236,5735237,5735238,5735239,5735240,5735241,5735242,5735243,5735273,5735744,5735745, 
5735746,5735747,5735748,5735749,5735836,5735837,5735838,5735839,5735840,5735841,5735842, 
5735843,5735844,5735845,5735846,5735847,5735848,5735849,5735850,5735851,5735852,5735853, 
5735854,5735855,5735856,5735857,5735858,5735859,5737183,5738250,5738563,5738564,5738565, 
5738566,5738567,5738568,5738569,5738570,5738731,5738732,5738946" name="someName"> 

Estoy usando ASP.NET MVC 3, y agradecería una solución que pudiera integrarse con un mínimo esfuerzo. Idealmente, me gustaría poder pasar valores de modelo de más de 1024 caracteres con sintaxis de afeitar.

También necesito poder manipular el valor del lado del cliente, usando JavaScript/jQuery.

¿Qué hacen todos para evitar este problema? Idealmente, me gustaría tratar el valor como una variable única. ¿Hay una buena manera de manejar esa información? El valor más grande para mi uso parece ser de aproximadamente 40k de tamaño.

Editar: Si nota el ... en el valor del elemento de entrada anterior, parece que el valor se está acortando a 1024 caracteres, para encajar en el atributo de valor. No estoy seguro de la causa de este problema, pero creo que es un límite en el tamaño del atributo. Si alguien puede negar esto, y/o explicar cómo permitir un atributo o campo más grande en alguna parte, lo agradecería enormemente. Preferiría mantener el factoring al mínimo, ya que ya tengo una inversión importante en la arquitectura actual. Una cantidad de otros componentes actualmente utilizan esta lista de valores en su forma actual.

Editar: ¡Mi error! Firebug informaba el "..." y causaba errores de JavaScript. Aparentemente no maneja bien los atributos de más de 1024 caracteres. Todos los datos están de hecho poblando sin problema (cuando firebug está desactivado). Esto parece ser un problema con Firebug. Pido disculpas por las molestias.

+0

Creo que debería volver a pensar su arquitectura si necesita cajas de entrada de 40K de largo .. ¿Le importa compartir el concepto detrás de esta necesidad? –

+0

¿Estás seguro de que el límite está en entradas ocultas? Sé que hay un problema con el límite de tamaño de QueryString en .Net4 que es 1024, sin tener nada que ver con MVC. Se puede configurar en web.config –

+0

Agregar lo siguiente en el web.config no parece tener ningún efecto: ... user1003221

Respuesta

4

uso la agrupación

<input name="someIDs[0]" type="hidden" value="5538680"/> 
<input name="someIDs[1]" type="hidden" value="5538683/> 

actualización: controladores de

public ActionResult Test() 
    { 
     Random rand = new Random(); 
     List<int> list = new List<int>(); 
     for (int i = 0; i < 10000; i++) 
     { 
      list.Add(rand.Next(1,999999)); 
     } 
     return View(list); 
    } 
    [HttpPost] 
    public ActionResult Test(int[] item) 
    { 
     return View(item.ToList()); 
    } 

vista

@model List<int> 
@{ 
    ViewBag.Title = "Test"; 
} 

@using (Html.BeginForm()) 
{ 
    foreach (int item in Model) 
    { 

     <input type="hidden" name="item" value="@item" /> 
    } 
    <input type="submit" value="submit" /> 
} 
+0

Como no sé de dónde viene el límite, también puedes probar

+0

Si bien el problema no existía, lo estoy marcando como la respuesta, ya que es más limpio que mi solución. – user1003221

5

¿Qué tal un

<textarea name="someName">5538680,5538683,...</textarea> 

con una regla de estilo/css de display:none que se le aplica?

0

1024 es el límite de cualquier atributo en un elemento HTML en HTML 3 y siguientes. Para evitarlo, podría usar un área de texto donde coloque el valor entre las etiquetas.

Dado que tiene tantos datos, es mejor que implemente algún tipo de paginación en el servidor y use AJAX para solicitar el siguiente conjunto de datos.

0

Creo que la manera más "correcta" de hacer esto sería usando atributos de datos.

#my-info { 
    display: none; 
} 

<div id="my-info" data-ids="id1,id2,etc"></div> 

O a través de javascript:

<script> 
    $("#my-info").data("ids", @Model.JsonIds); 
</script> 

Y tienen Model.JsonIds poblada con una cadena JSON.

Yo personalmente iría con el segundo, probablemente.

0

Estoy de acuerdo con @Gaby en volver a pensar en la arquitectura. Pero si realmente debe hacerlo, le sugiero que cree una matriz de javascript. De esa forma, será mucho más fácil trabajar con datos. es bastante simple hacer esto con una navaja de afeitar.

0

i no reall y creo que hay un límite. siempre que pueda obtener la longitud de su cadena entre las comillas "" y en la misma línea, debería aceptarla. hay rumores de que son 65000 caracteres, sin embargo, alguien escribió un javascript y obtuvo más de 2,000,000 de caracteres.

+0

Esto debería ser un comentario – ketan

Cuestiones relacionadas