2010-09-28 11 views
5

Implementé Autocompletar y tengo problemas con la etiqueta frente al valor en el cuadro de texto después de seleccionar el elemento. Cuando escribo en un código postal, veo la etiqueta en el menú desplegable:JQuery UI Autocompletar con .Net MVC: Cómo mostrar la etiqueta cuando está seleccionada, pero guardar el valor

pero después de seleccionar uno, en lugar de la etiqueta que muestra en el cuadro de texto, el valor (que es el ID que necesita para ser guardado en la base de datos) se visualiza:

¿Cómo siguen mostrando la etiqueta después de que se ha seleccionado, pero luego cuando se guarda el formulario, se pasa el ZipCodeID para el campo?

Aquí es mi método de control:

public JsonResult FindZipCode(string term) 
    { 
     VetClinicDataContext db = new VetClinicDataContext(); 

     var zipCodes = from c in db.ZipCodes 
         where c.ZipCodeNum.ToString().StartsWith(term) 
         select new { value = c.ZipCodeID, label = c.ZipCodeNum}; 

     return this.Json(zipCodes, JsonRequestBehavior.AllowGet); 
    } 

Y aquí es mi marcado:

<script type="text/javascript"> 
    $(document).ready(function() { 
     $("#ZipCodeID").autocomplete({ 
        source: '<%= Url.Action("FindZipCode", "Customers") %>', 
     }); 
    }); 
</script> 

<div class="ui-widget"><input type="text" name="ZipCodeID" id="ZipCodeID" /></div> 

EDIT: Aquí está mi código de trabajo final:

controlador:

public JsonResult FindZipCode(string term) 
    { 
     VetClinicDataContext db = new VetClinicDataContext(); 

     var zipCodes = from c in db.ZipCodes 
         where c.ZipCodeNum.ToString().StartsWith(term) 
         select new { value = c.ZipCodeID, label = c.ZipCodeNum}; 

     return this.Json(zipCodes, JsonRequestBehavior.AllowGet); 
    } 

y marcado:

<script type="text/javascript"> 
    $(document).ready(function() { 
     $("#ddZipCode").autocomplete({ 
      source: '<%= Url.Action("FindZipCode", "Customers") %>', 
      select: function(event, ui) { 
       var zipCodeID = parseInt(ui.item.value, 1); 
       $("#ddZipCode").val(ui.item.label); 
       $("#ZipCodeID").val(ui.item.value); 
       return false; 
      } 
     }); 
    }); 
</script> 

<div class="ui-widget"><input type="text" name="ddZipCode" id="ddZipCode" /></div> 
<%= Html.Hidden("ZipCodeID")%> 
+0

no son códigos postales lo suficientemente únicos como para no necesitar una identificación separada? No puedo entender por qué lo querrías de otra manera –

+0

¡buen punto! cuando originalmente construí la base de datos, era bastante nuevo en eso. Configuré mis códigos postales para tener un ID automático incrementado sin pensar realmente que los códigos postales son únicos. Podría volver atrás y cambiarlo ahora, pero los efectos se convertirían en muchos otros cambios en otros lugares. Probablemente debería hacerlo de todos modos ... :) ¡Gracias! – Ben

+0

Sin problemas. Es genial que estés aprendiendo cosas y teniendo un enfoque pragmático. –

Respuesta

6

menos que cambiar su modelo para no utilizar un ID diferente para códigos postales ...

crear un campo oculto para el ID de código postal. Cambie el comportamiento de selección para rellenar el campo oculto con el ID y el visible con la etiqueta.

Ver The sample de cómo lograr esto

¿Ha considerado lo que sucede si escribe en su propio?

4

Si agrega las siguientes líneas, se mostrará la etiqueta y NO la identificación (que pensé que debería ser la predeterminada, pero bueno).

select: function (event, ui) { 
    event.preventDefault(); 
    event.target.innerText = ui.item.label; 
} 
+1

Cuando ejecuto esto obtengo un error de tiempo de ejecución en JavaScript: 'Error: NO_MODIFICATION_ALLOWED_ERR: DOM Exception 7' ¿Alguna idea sobre cómo evitar esto? – Scott

Cuestiones relacionadas