6

Algo extraño sucede en una de mis aplicaciones ASP.NET MVC 3.vista parcial sin atributos de validación (ASP.NET MVC 3)

Estoy buscando filas de inserción a través de jQuery Ajax api y no hay ningún problema con eso. Pero cuando recupero la vista parcial necesaria, viene sin atributos de validación y no puedo volver a vincular la validación para esas filas.

Esto es lo que se obtiene como respuesta ajax:

<input type="hidden" name="accommPropertyPeriods.index" autocomplete="off" value="ccaa15b3-76f1-4215-8bb5-a62d700bfc1e" /> 
    <table style="width:100%;"> 
    <tr> 
     <td> 
      <div class="editor-field"> 
       <select class="chzn-select-deselect" data-placeholder="Choose an Alias..." id="accommPropertyPeriods_ccaa15b3-76f1-4215-8bb5-a62d700bfc1e__AccommPropertySeasonPeriodAliasID" name="accommPropertyPeriods[ccaa15b3-76f1-4215-8bb5-a62d700bfc1e].AccommPropertySeasonPeriodAliasID" style="min-width:100px;"><option value="302">A</option> 
<option value="303">B</option> 
<option value="304">C</option> 
<option value="305">D</option> 
</select> 

      </div> 
     </td> 
     <td> 
      <div class="editor-field"> 
       <input class="datefield" id="accommPropertyPeriods_ccaa15b3-76f1-4215-8bb5-a62d700bfc1e__PeriodStartsAt" name="accommPropertyPeriods[ccaa15b3-76f1-4215-8bb5-a62d700bfc1e].PeriodStartsAt" type="text" value="" /> 

      </div> 
     </td> 
     <td> 
      <div class="editor-field"> 
       <input class="datefield" id="accommPropertyPeriods_ccaa15b3-76f1-4215-8bb5-a62d700bfc1e__PeriodEndsAt" name="accommPropertyPeriods[ccaa15b3-76f1-4215-8bb5-a62d700bfc1e].PeriodEndsAt" type="text" value="" /> 

      </div> 
     </td> 
    </tr> 
    </table> 

Esto es lo que debería llegar:

<input type="hidden" name="accommPropertyPeriods.index" autocomplete="off" value="84ddd0f5-a3e2-4f10-8e67-f32528c6393d" /> 
    <table style="width:100%;"> 
    <tr> 
     <td> 
      <div class="editor-field"> 
       <select class="chzn-select-deselect" data-placeholder="Choose an Alias..." data-val="true" data-val-number="The field AccommPropertySeasonPeriodAliasID must be a number." data-val-required="The AccommPropertySeasonPeriodAliasID field is required." id="accommPropertyPeriods_84ddd0f5-a3e2-4f10-8e67-f32528c6393d__AccommPropertySeasonPeriodAliasID" name="accommPropertyPeriods[84ddd0f5-a3e2-4f10-8e67-f32528c6393d].AccommPropertySeasonPeriodAliasID" style="min-width:100px;"><option value="302">A</option> 
<option value="303">B</option> 
<option value="304">C</option> 
<option value="305">D</option> 
</select> 
       <span class="field-validation-valid" data-valmsg-for="accommPropertyPeriods[84ddd0f5-a3e2-4f10-8e67-f32528c6393d].AccommPropertySeasonPeriodAliasID" data-valmsg-replace="false">*</span> 
      </div> 
     </td> 
     <td> 
      <div class="editor-field"> 
       <input class="datefield" data-val="true" data-val-required="The PeriodStartsAt field is required." id="accommPropertyPeriods_84ddd0f5-a3e2-4f10-8e67-f32528c6393d__PeriodStartsAt" name="accommPropertyPeriods[84ddd0f5-a3e2-4f10-8e67-f32528c6393d].PeriodStartsAt" type="text" value="" /> 
       <span class="field-validation-valid" data-valmsg-for="accommPropertyPeriods[84ddd0f5-a3e2-4f10-8e67-f32528c6393d].PeriodEndsAt" data-valmsg-replace="false">*</span> 
      </div> 
     </td> 
     <td> 
      <div class="editor-field"> 
       <input class="datefield" data-val="true" data-val-required="The PeriodEndsAt field is required." id="accommPropertyPeriods_84ddd0f5-a3e2-4f10-8e67-f32528c6393d__PeriodEndsAt" name="accommPropertyPeriods[84ddd0f5-a3e2-4f10-8e67-f32528c6393d].PeriodEndsAt" type="text" value="" /> 
       <span class="field-validation-valid" data-valmsg-for="accommPropertyPeriods[84ddd0f5-a3e2-4f10-8e67-f32528c6393d].PeriodEndsAt" data-valmsg-replace="false">*</span> 
      </div> 
     </td> 
    </tr> 
    </table> 

GUID no tienen que ser los mismos. Estoy haciendo lo que se conoce como enlace no secuencial.

Aquí es el de la acción que yo estoy invocando a través jquery ajax para obtener una nueva fila de inserción:

[HttpPost] 
    public PartialViewResult accommPropertySeasonPeriodCreatePartialView(int id, int subid) { 

     //some other stuff going on here. non-related to partial view. 

     return PartialView("_AccommPropertySeasonPeriodCreatePartialView"); 
    } 

estoy casi fuera de mi mente para averiguar qué está sucediendo esto. ¿Alguna idea?

Respuesta

10

Los helpers Html.* como Html.TextBoxFor, Html.CheckBoxFor, ... emiten atributos de validación solo si se usan dentro de un formulario. Así que asegúrese de envolverlos en una llamada Html.BeginForm. En lo que respecta a la validación del lado del cliente, debe llamar al método jQuery.validator.unobtrusive.parse después de actualizar su DOM para volver a aplicar la validación del cliente. Y yet another article.

Si usted no tiene una forma que se puede engañar y poner el siguiente en el parcial:

@model MyViewModel 
@{ 
    ViewContext.FormContext = new FormContext(); 
} 
@Html.EditorFor(x => x.Foo) 

Ahora el ayudante emitirá atributos Data- * validación en el campo de entrada.

+0

oww, va a ser un problema. Ya tengo un formulario en mi vista principal. ¿Alguna otra forma de evitar esto automáticamente o debería anular las plantillas del Editor? – tugberk

+0

@tugberk, consulte mi actualización sobre la instanciación manual de FormContext en el parcial. –

+0

¡Impresionante! Totalmente trabajado. Para entenderlo, ¿qué es exactamente lo que este ajuste le dice al marco (o al motor de plantillas?) Para que comprenda la emisión de atributos de validación de datos * en el campo de entrada? – tugberk

Cuestiones relacionadas