2009-04-15 14 views
11

Tengo este marcado en una aplicación MVC.MVC - Uso de Ajax para hacer una vista parcial

<div id="ingredientlistdiv"> 
    <% Recipe recipe = (Recipe)Model; %> 
    <% Html.RenderPartial("IngredientsListControl", recipe.Ingredients); %> 
</div> 

<div id="ingrediententrydiv" align="left"> 
    <% using (Ajax.BeginForm("Add Ingredient", "Recipes/UpdateStep2", new AjaxOptions { UpdateTargetId = "ingredientlistdiv" })) 
     { %> 
    <p> 
     <label for="Units">Units:</label><br /> 
     <%= Html.TextBox("Units", 0)%> 
     <%= Html.ValidationMessage("Units", "*")%> 
    </p> 
    <p> 
     <label for="Measure">Measure:</label><br /> 
     <%= Html.TextBox("Measure")%> 
     <%= Html.ValidationMessage("Measure", "*")%> 
    </p> 
    <p> 
     <label for="IngredientName">Ingredient Name:</label><br /> 
     <%= Html.TextBox("IngredientName")%> 
     <%= Html.ValidationMessage("IngredientName", "*")%> 
    </p> 
    <p><a href="javascript:document.forms[0].submit()">Save Ingredient</a></p> 
    <%= Html.Hidden("RecipeID", recipe.RecipeID.ToString())%> 
    <% } %> 
</div> 

Cuando esto corre el IngredientsListControl.ascx displayas una nueva página en el navegador y no actualiza el ingredientlistdiv.

Ésta es mi acción del controlador

[AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult UpdateStep2(FormCollection form) 
     { 
      var factory = SessionFactoryCreator.Create(); 

      using (var session = factory.OpenSession()) 
      { 
       Recipe recipe = GetRecipe(session, Convert.ToInt32(form["RecipeID"])); 

       Ingredient ingredient = new Ingredient(); 

       ingredient.UpdateFromForm(form); 
       ingredient.Validate(ViewData); 

       if (ViewData.ModelState.Count == 0) 
       { 
        recipe.Ingredients.Add(ingredient); 
        session.Save(recipe); 
        return PartialView("IngredientsListControl", recipe.Ingredients); 
       } 


       return Content("Error"); 
      } 
     } 

estoy haciendo lo correcto en esta línea?

return PartialView("IngredientsListControl", recipe.Ingredients); 

¿Es así como me representar el control en el div para que no se carga nueva página. ???

Malcolm

+0

Siempre hemos utilizado la ruta completa, aplicación, en relación a la parte del nombre, por ejemplo, Html.RenderPartial ("~/Views/Home/ModuleNewUser.ascx") –

+0

¿Está mostrando el parcial como una página nueva? ¿O alguna otra página? ¿Cuál es el contenido de tu parcial? –

Respuesta

8

Cuando se utiliza esta:

<a href="javascript:document.forms[0].submit()"> 

... Debe tener en cuenta que no es lo mismo que

<input type="submit" /> 

No aumenta el evento onsubmit y eventhandler AJAX es de MVC no llamado

Para confirmar que este es el problema, agregue

<input type="submit" /> 

dentro de la forma y probarlo.

Por último, simplemente llame onsubmit() desde su enlace

<a href="#" onclick="document.forms[0].onsubmit()"> 
+1

Sin embargo, le sugiero que use el botón de envío estándar (, Html.SubmitButton MVC helper). Se encontrará con muchos problemas si envía formularios con /JS; es muy difícil hacerlo funcionar en TODOS los navegadores. Puede cambiar la apariencia del botón Enviar con estilos CSS, y funciona al 100% en todos los escenarios. – Alex42

-2

renderPartial toma un nombre de acción, no el nombre del control de usuario, por lo que en lugar de "IngredientsListControl" con "UpdateStep2", el nombre de la acción.

+1

Lo siento, pero estoy bastante seguro de que no es así. Eso es lo que hace RenderAction, que está incluido en MvcFutures. –

2

Puede valer la pena asegurarse de que ha hecho una referencia correcta a los scripts ajaxmvc y jquery en su página (página maestra). Si estos son incorrectos, se mostrará una nueva página en lugar de la salida correcta en el div de destino.

+0

Exactamente lo que quería decir. No puedo encontrar otras razones simplemente mirándolo. :) –

Cuestiones relacionadas