Domanda

Ho questo markup in un app MVC.

<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>

Quando questo viene eseguito l'IngredientsListControl.ascx displayas una nuova pagina nel browser e non aggiorna l'ingredientlistdiv.

Questa è la mia azione di controllo

[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");
            }
        }

sto facendo la cosa giusta su questa linea?

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

È così che ho il rendering del controllo nel div così lo fa Non caricare nuova pagina. ???

Malcolm

È stato utile?

Soluzione

Quando si utilizza questa:

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

... si deve essere consapevoli che non è lo stesso di

<input type="submit" />

E non solleva l'evento onSubmit, e AJAX EventHandler di MVC non viene chiamato.

A conferma di ciò è il problema, aggiungere

<input type="submit" /> 

all'interno del modulo e provarlo.

Infine, basta chiamare onsubmit () dal tuo link

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

Altri suggerimenti

Potrebbe valere la pena assicurando di aver correttamente fatto riferimento gli script ajaxmvc e jQuery nella tua pagina (pagina master). Se questi sono corretti una nuova pagina verrà visualizzato al posto del l'uscita corretta nel div destinazione.

RenderPartial prende un nome di azione, non il nome del controllo utente, in modo da sostituire "IngredientsListControl" con "UpdateStep2", il vostro nome di azione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top