2010-04-16 30 views
10

Estoy usando jQuery.load() para hacer una vista parcial. Esta parte se ve así:Vista parcial de carga de ASP.NET MVC 2 usando jQuery - sin validación del lado del cliente

$('#sizeAddHolder').load(
       '/MyController/MyAction', function() { ... }); 

El código para acciones en mi controlador es el siguiente:

public ActionResult MyAction(byte id) 
    { 
     var model = new MyModel 
     { 
      ObjectProp1 = "Some text" 
     }; 

     return View(model); 
    } 

    [HttpPost] 
    public ActionResult MyAction(byte id, FormCollection form) 
    { 
     // TODO: DB insert logic goes here 

     var result = ...; 

     return Json(result); 
    } 

estoy volviendo una vista parcial que se ve algo como esto:

<% using (Html.BeginForm("MyAction", "MyController")) {%> 
    <%= Html.ValidationSummary(true) %> 

    <h3>Create my object</h3> 

    <fieldset> 
     <legend>Fields</legend> 

     <div class="editor-label"> 
      <%= Html.LabelFor(model => model.ObjectProp1) %> 
     </div> 
     <div class="editor-field"> 
      <%= Html.TextBoxFor(model => model.Size.ObjectProp1) %> 
      <%= Html.ValidationMessageFor(model => model.ObjectProp1) %> 
     </div> 

     div class="editor-label"> 
      <%= Html.LabelFor(model => model.ObjectProp2) %> 
     </div> 
     <div class="editor-field"> 
      <%= Html.TextBoxFor(model => model.ObjectProp2) %> 
      <%= Html.ValidationMessageFor(model => model.ObjectProp2) %> 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 

<% } %> 

La validación del lado del cliente no funciona en este caso. Además, el script que contiene mensajes de validación tampoco está incluido en la vista que se devuelve. Ambas propiedades en mi clase de modelo tienen atributos Required y StringLength. ¿Hay alguna manera de activar la validación del lado del cliente en una vista que se ha cargado así?

Respuesta

7

Antes que nada, debe devolver una vista parcial y no una vista.

return PartialView(model); 

En segundo lugar, ¿está intentando cargar esta vista parcial con AJAX? En ese caso, es posible que desee utilizar jquery.ajax

function ajax_update(path) 
    $.ajax { 
    url: path, 
    success: function(result) { 
     $('#sizeAddHolder').html(result); 
    } 
    return false; 
} 
+2

Gracias por valiosa información. He corregido estos errores, pero eso realmente no hace la diferencia. El html renderizado es exactamente el mismo en ambos casos, ya que 'load()' obtiene el html de la misma forma que 'ajax()' usando XMLHttpRequest y 'return View (model)' si no hay SomeAction.aspx renderizará SomeAction.ascx . Eche un vistazo aquí: http://stackoverflow.com/questions/2043394/what-is-the-difference-between-a-view-and-a-partialview-in-asp-net-mvc Así que el problema principal es sigue ahí: sin validación del lado del cliente; ninguna secuencia de comandos que contenga mensajes de validación ... –

+1

El código anterior no resuelve el problema original –

+1

que puede devolver una Vista también, en realidad no importa siempre que la vista que está devolviendo no use la misma página maestra que la anterior donde se llama – Omu

2

Debe utilizar tipo de datos en la llamada ajax

function ajax_update(path) 
    $.ajax { 
    url: path, 
    dataType: "html", 
    success: function(result) { 
     $('#sizeAddHolder').html(result); 
    } 
    return false; 
} 

De jQuery docs:

tipoDatos defecto: suposición inteligente (XML, JSON, escritura o html)

El tipo de datos que espera del servidor. Si no se especifica ninguno, jQuery intentará obtener los resultados de manera inteligente, basándose en el tipo MIME de la respuesta (un tipo MIME XML arrojará XML, en 1.4 JSON generará un objeto JavaScript, en 1.4 script ejecutará el script, y cualquier cosa else será devuelto como una cadena). Los tipos disponibles (y el resultado se pasa como primer argumento a su devolución de llamada de éxito) son:

* "xml": Returns a XML document that can be processed via jQuery. 
* "html": Returns HTML as plain text; included script tags are evaluated when inserted in the DOM. 
* "script": Evaluates the response as JavaScript and returns it as plain text. Disables caching unless option "cache" is used. Note: This will turn POSTs into GETs for remote-domain requests. 
* "json": Evaluates the response as JSON and returns a JavaScript object. In jQuery 1.4 the JSON data is parsed in a strict manner; any malformed JSON is rejected and a parse error is thrown. (See json.org for more information on proper JSON formatting.) 
* "jsonp": Loads in a JSON block using JSONP. Will add an extra "?callback=?" to the end of your URL to specify the callback. 
* "text": A plain text string. 
+0

Gracias por esta información. El problema es que en un caso me gustaría devolver html (cuando los datos pasados ​​no eran válidos, ya que la validación del lado del cliente falla) para que el usuario pueda hacer cambios y publicarlos nuevamente. Pero cuando se validaron los datos y se creó un nuevo objeto en la base de datos, me gustaría devolver a Json. ¿Hay alguna manera de verificar el tipo de resultado devuelto? –

+0

Intente configurar el tipo de respuesta MIME: * Si no se especifica ninguno, jQuery intentará obtener los resultados inteligentemente, en función del tipo MIME de la respuesta * –

+0

Creo que este es el comportamiento predeterminado y "si no se especifica ninguno" en este caso significa "si no lo configura explícitamente" en lugar de "configurarlo en ninguno". – bszom

1

El problema es que la forma cargada con ajax nunca se registra con la validación de Microsoft. Para resolverlo, llame a la siguiente función Sys.Mvc.FormContext._Application_Load.

function ajax_update(path) 
    $.ajax { 
    url: path, 
    success: function(result) { 
     $('#sizeAddHolder').html(result); 
     Sys.Mvc.FormContext._Application_Load(); 
    } 
    return false; 
} 

Eso debería solucionarlo. Además, asegúrese de que los formularios que carga a través de ajax tengan identificadores únicos. De lo contrario, la validación fallará.

Evite el uso de la carga(). Elimina cualquier script cargado en la respuesta.

0

en el archivo HTML que puede tener algo como:

lo siento por eso, pero no no ¿Cómo enviar un enlace html.Lo que puede tener un enlace clase = "eliminar", Identificación = valor y a href ="javascript :;"

Luego utiliza esta función para hacer una vista parcial:

$(".delete").click(function(event){ 
      var id = $(".select").attr("id"); 
      var id2 = event.target.id; 
      $.ajax({ 
       url: "Persona/Delete?idPersona=" + id2.toString(), 
       success: function (data) { 
        $("#popUpConfirmar").html(data); 
       } 
      }); 

      dialogoPopUp.dialog("open"); 
     }); 

Recuerdo que en la controladora debe tener una acción como:

public PartialViewResult Delete(int idPersona) 
    { 
     PersonaDataAccess personaDataAccess = new PersonaDataAccess(); 
     Persona persona = personaDataAccess.GetOne(idPersona); 
     return PartialView("Delete",persona); 
    } 
Cuestiones relacionadas