2011-12-23 54 views
0

我是MVC的新手,喜歡它,但遇到了問題。我有與代碼視圖這樣的:ASP.NET MVC3 Ajax:InsertionMode.Replace按預期工作

@model MyModel 

@Ajax.ActionLink("Add", "Create", "User", null, 
    new AjaxOptions { 
     UpdateTargetId = "mydiv", 
     InsertionMode = InsertionMode.Replace, 
     HttpMethod = "GET" 
    }, 
    new { 
     @class = "add" 
    }) 

<div> 
    @Html.Partial("UserTable", Model.RegisteredUsers) 
</div> 

<div id="mydiv" /> 

這可能是非常明顯的,但頁面顯示用戶清單(以下簡稱「用戶表」局部視圖),幷包括一個鏈接,管理員點擊創建一個新用戶。創建用戶表單是一個局部視圖,就像在UserTable上的彈出窗口一樣。下面是返回創建用戶表單控制器動作:

public string Create() 
{ 
    Models.User user = new Models.User(); 
    PartialViewResult vr; 
    ViewContext vc; 
    StringWriter sw = new StringWriter(); 

    vr = PartialView("../../Views/User/UserForm", user); 
    vr.ExecuteResult(this.ControllerContext); 
    vc = new ViewContext(this.ControllerContext, vr.View, vr.ViewData, new TempDataDictionary(), sw); 
    vr.View.Render(vc sw); 

    return "<div style=\"position:absolute; top:200px; left:175px\">" + sw.ToString() + "</div>"; 
} 

的原因,我返回一個字符串,而不是一個ActionResult(或類似的東西)是添加創建「彈出式」效應的包裝股利。除了在「彈出窗口」中顯示之外,創建用戶窗體還顯示在UserTable的下方,其中「mydiv」是。對頁面源代碼的檢查顯示「mydiv」沒有被替換,而是創建用戶表單的代碼被放置在新的彈出窗格中的div 中,而且我沒有運氣計算爲什麼。

我想我引用正確的jQuery庫:

<script src="@Url.Contetn("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script> 
<script src="@Url.Contetn("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script> 

誰能告訴我爲什麼我得到這個行爲,以及如何解決它?還是有更好的方法來達到您可以推薦的相同效果?

TIA!

傑夫

編輯:

哦,忘了提:我不能只把在創建用戶窗體本身的「彈出」分區的原因是它在其他地方使用該系統,而那種行爲在那裏是不可取的。我沒有自己創建該表單,只是在我的場景中重用了另一個開發人員的代碼。

回答

1

我想我明白了這一點。我誤解了控制器操作中的Render方法正在做什麼。它應該很明顯,但它實際上是將部分視圖寫入頁面。當動作返回時,它再次寫入,這次是用「popup」div。

雖然我找到了另一種方法來處理這個問題。正如我所提到的,我無法直接修改創建用戶表單,但我創建了另一個局部視圖,並通過@Html.Partial將創建用戶表單添加到它,所有都包裹在彈出的div中。然後,我所要做的就是從控制器操作中返回這個「派生」的部分視圖,它像一個魅力一樣工作。

無論如何,只是以爲我會發布這個以防萬一有人發現自己處於類似的情況。

Jeff