2009-04-15 32 views
11

Tôi có đánh dấu này trong ứng dụng MVC.MVC - Sử dụng Ajax để hiển thị một phần xem

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

Khi điều này chạy IngredientsListControl.ascx displayas một trang mới trong trình duyệt và không cập nhật ingredientlistdiv.

Đây là điều khiển hành động của tôi

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

Am Tôi làm đúng trên dòng này?

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

Đó có phải là cách tôi đưa điều khiển vào div để không không tải trang mới. ???

Malcolm

+0

Chúng tôi luôn sử dụng, đường dẫn ứng dụng tương đối đầy đủ cho tên một phần, ví dụ Html.RenderPartial ("~/Views/Home/ModuleNewUser.ascx") –

+0

Nó có hiển thị một phần như một trang mới không? Hoặc một số trang khác? Nội dung của bạn là gì? –

Trả lời

8

Khi bạn sử dụng này:

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

... bạn nên biết rằng nó không phải là giống như

<input type="submit" /> 

Nó không nâng cao sự kiện onsubmit, và AJAX eventhandler MVC là không được gọi.

Để khẳng định điều này là vấn đề, thêm

<input type="submit" /> 

bên trong hình thức và thử nó ra.

Cuối cùng, chỉ cần gọi onsubmit() từ liên kết của bạn

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

Tuy nhiên, tôi đặc biệt khuyên bạn nên sử dụng nút gửi tiêu chuẩn (, Html.SubmitButton MVC helper). Bạn sẽ gặp rất nhiều rắc rối nếu bạn gửi biểu mẫu với /JS - rất khó để làm cho nó hoạt động trong TẤT CẢ các trình duyệt. Bạn có thể thay đổi giao diện của nút gửi với kiểu css và nó hoạt động 100% trong tất cả các trường hợp. – Alex42

-2

renderPartial mất một tên hành động, không phải là tên của điều khiển người dùng, vì vậy thay thế "IngredientsListControl" với "UpdateStep2", tên hành động của bạn.

+1

Xin lỗi, nhưng tôi khá chắc chắn là không. Đó là những gì RenderAction làm được bao gồm trong MvcFutures. –

2

Có thể đảm bảo rằng bạn đã tham chiếu chính xác tập lệnh ajaxmvc và jquery trong trang của mình (trang chính). Nếu đây không chính xác, một trang mới sẽ được hiển thị thay vì đầu ra chính xác trong div đích.

+0

Chính xác những gì tôi muốn nói. Không thể tìm thấy lý do khác chỉ cần nhìn vào nó. :) –

Các vấn đề liên quan