Validação discreta do MVC3 não está funcionando após a chamada do Ajax

Ok, aqui está o acordo, eu vi alguns posts sobre SO relacionados a esse problema, mas nada está funcionando para mi

Basicamente, selecione drop-downs que estão sendo carregados a partir de visualizações parciais, estou tentando filtrar o conteúdo de cada drop-down subsequente, com base no drop-down selecionado anteriorment

Se eu apenas colocar a chamada para a exibição parcial nos contêineres div e carregar a página, a validação das anotações de dados funcionará bem,primarily Atributo obrigatório.

No entanto, se eu tentar carregar a mesma parcial via AJAX como está configurada aqui, a validação necessária não funcionará, qualquer um poderá postar o formulário depois disso e no KABOO

Encontrei pessoas dizendo que, no retorno de chamada Success, é necessário que o validador do lado do cliente reveja o formulário e estou tentando isso, mas parece que não está funcionando.

Tenho uma visão que se parece com isso ...

  @model Area51.Models.Workflow.AddReportableItemToBatchActionModel
@{
    ViewBag.Title = "Add Reportable Item to Batch";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<script type="text/javascript">

    $(function () {
        var fadeDelay = 150;

        $(".jqDatePicker").datepicker({
            dateFormat: 'm/d/yy',
            onSelect: function (date) {
                $("#categoryContainer").show(fadeDelay);
            }
        });

        $('#Category').change(function () {
            RetrieveItemsForCategory();
            $("#itemContainer").show(100);
        });

        $('#Item').live('change', function () {
            RenderPartialForUOMByItem();           
        });



        function RetrieveItemsForCategory() {

            var category = $("#Category :selected").val();

            $.ajax({
                type: "POST",

                url: '@Url.Action("RenderPartialForLocationItemsByCategory","BatchWorkflow")',

                data: 'category=' + category,

                success: function (result) {
                    $("#itemContainer").html(result.toString());
                    $("#itemContainer").show(100);
                    RebindValidation();
                },

                error: function (req, status, error) {
                    alert("Sorry! Could not request items for your selection at this time.");
                }

            });


        }


        function RenderPartialForUOMByItem() {

            var item = $("#Item :selected").val();

            $.ajax({
                type: "POST",

                url: '@Url.Action("RenderPartialForUOMByItem","BatchWorkflow")',

                data: "item=" + item,

                success: function (result) {
                    $("#quantityContainer").html(result.toString());
                    $("#quantityContainer").show(100);
                    RebindValidation();
                },

                error: function (req, status, error) {
                    alert("Sorry! Could not request items for your selection at this time.");
                }

            });
        }

        function RebindValidation() {
            alert("Rebinding Validation");
            $.validator.unobtrusive.parse("#frmAddItem");
        }

    });      // End OnLoad Event
</script>

<h3 class="pageHeader">Batch : @Model.BatchName</h3>

<div align="center">

@{Html.BeginForm("AddItemToBatch", "BatchWorkflow", null, FormMethod.Post, new { id = "frmAddItem" });}

    @Html.ValidationSummary(true)

    <fieldset style="width:60%">
        <legend>Add an Item to the Batch</legend>     

     <div>       
          <h3>Select Date Item was Added</h3>
          @Html.EditorFor(x => x.EventDate,null)
          <br />
      </div>

      <div id="categoryContainer" style="display:none"> 
        <hr />
          <h3>Select an Inventory Category</h3>
          @Html.EditorFor(x => x.Category,null)
          <br />
      </div>

      <div id="itemContainer" style="display:none"> 
        @*   @{Html.RenderAction("RenderPartialForLocationItemsByCategory", "BatchWorkflow", new { category = Model.Category });}*@
      </div>


      <div id="quantityContainer" style="display:none"> 
        @*  @{Html.RenderAction("RenderPartialForUOMByItem", "BatchWorkflow", new { item = Model.Item });}*@
      </div>

      <div id="reportingDataContainer" style="display:none"> 
        <hr />
          <h3>What quantity of the batch was affected by this addition?</h3>
          @Html.EditorFor(x => x.ConsumedWineQuantity) (Gallons)
        <br />
        <hr />
          <h3>What was the increase in Batch Volume as a result of this addition?</h3>
          @Html.EditorFor(x => x.ProducedWineQuantity) (Gallons)
      </div>

        <div style="display:block">
        <div></div>        
            <span><button type="button" id="btnCancel" class="linkButton" value="Cancel" onclick="location.href='@Url.Action("Home","Home",null)';">Cancel</button></span>  
            <span><button type="submit" id="btnSubmit" class="linkButton" value="Add">Add Item</button></span>
        </div>


    </fieldset>
        @{ Html.EndForm(); }
</div>

As vistas parciais são muito simples, basicamente se parecem com isso ...

@model Area51.Models.Workflow.AddReportableItemToBatchActionModel

      <hr />
          <h3>Select the Item to Add</h3>
          @Html.EditorFor(x => x.Item)
          <br />

Novamente, se eu apenas RenderPartial, a validação funciona bem, no entanto, quando tento fazê-lo via ajax, a validação desaparece. O alerta "Validação de religação" é acionado, mas o $ .validator.unobtrusive.parse ("# frmAddItem"); parece não estar fazendo nada.

Alguém pode ajudar com o que estou perdendo? Seria muito apreciado.

<======================= ATUALIZAÇÃO 1 ======================= ======>

OK, tentei adicionar o $ .validator.unobtrusive.parse ("# frmAddItem"); na parte inferior da exibição parcial em um evento pronto para documento e também não parecia funcionar, basicamente nada mudou, eu ainda podia enviar o formulário.

Encontrei um post aqui:http: //xhalent.wordpress.com/2011/01/24/applying-unobtrusive-validation-to-dynamic-content que mencionou que, quando a versão MVC da jqvalidation vê um formulário já possuir regras de validação vinculadas, ele simplesmente ignora a chamada .validator. Eu implementei a extensão de script que esse cavalheiro usava, e a validação agora está retornando ao formulário usando a nova extensão. Eu posso testar isso anexando html ao formulário e chamando a nova extensão, e ele está retornando à nova caixa de text

No entanto, isso ainda não resolveu completamente o problema. Usei o Firebug para verificar o conteúdo real nos campos que retornavam da chamada ajax e notei algo muito estranh

Quando uso o RenderPartial para chamar a ação, ele escreve o seguinte select:

<select id="Item" name="Item" data-val-required="The Item field is required." data-val-number="The field Item must be a number." data-val="true">

No entanto, quando eu faço a chamada ajax para a mesma ação exata do controlador, isso me devolve:

<select id="Item" name="Item">

Eu tentei adicionar as tags de script também à exibição parcial, mas isso não resolveu o problema. Existe algum motivo para a chamada ajax remover as tags de validação discretas?

<======================= ATUALIZAÇÃO 2 ======================= ======>

Ok, então o que estava acontecendo, é que eu tinha um modelo de editor para a lista suspensa que pegou uma lista de seleção e a converteu em uma seleção de html. Eu encontrei um post que mencionava que, para obter atributos de validação de dados para escrever em um modelo de editor, você precisa ter um contexto de formulário. Como o Html.RenderPartial estava sendo feito em um formulário, o modelo do editor tinha um contexto de formulário para trabalhar. Quando eu estava apenas tentando chamar a parcial via ajax, não havia um contexto de formulário para trabalhar e, em vez de reclamar, simplesmente não escrevia os atributos de validação de dados. A adição de um novo Contexto de Formulário no modelo do editor para o SelectListDropDown corrigiu o problem

@{ // fix to stop stupid crappy brad wilson mvc3 code from stripping the jq data valdiation attributes
    if (ViewContext.FormContext == null)
    {
        ViewContext.FormContext = new FormContext();
    }
}

questionAnswers(5)

yourAnswerToTheQuestion