2009-08-19 102 views
2

我正在渲染一個頁面,其中頁面的一部分是通過部分呈現的FORM。該表單上的提交按鈕通過Ajax發送到我的控制器(使用JQuery .post())。當控制器動作接管時,有兩種可能的執行路徑:在ASP.NET MVC中從Ajax Post返回狀態和HTML

  1. 表單數據有效。在這種情況下,控制器用新記錄更新數據庫,然後通過呈現PartialView返回HTML表(並返回ViewResult)。

  2. 表單數據無效。在這種情況下,我想重新渲染原始表單 - 突出顯示驗證失敗。我相信我可以用不同的PartialView調用來做到這一點。

在客戶端,在完成JavaScript函數中,我必須區分成功與失敗的情況,因爲返回的HTML的DOM目標將不同。我想我可以檢查一些已知元素的HTML來區分這些情況,但在我看來,更好的解決方案是返回一個JSonResult,該JSonResult在一個字段中包含布爾狀態,而在另一個字段中包含HTML。

我知道如何從控制器返回JsonResult。但是,我需要能夠從PartialView調用中捕獲HTML,以便將該文本粘貼到該字段中。有誰知道:

(一)如何做到這一點,和/或

(B)更好的方式來處理這種情況。

TIA

更新8/20/2009

我想我來接近我想要使用此代碼:

 ViewEngineResult viewEngineResult = ViewEngines.Engines.FindPartialView(this.ControllerContext, "HospitalDoseList"); 
     ViewData.Model = hospitalStay; 
     ViewContext viewContext = new ViewContext(ControllerContext, viewEngineResult.View, this.ViewData, this.TempData); 
     using (StringWriter writer = new StringWriter()) { 
      viewEngineResult.View.Render(viewContext, writer); 
      string html = writer.ToString(); 
      JsonResult jsonResult = new JsonResult(); 
      jsonResult.Data = new {Status = true, Html = HttpUtility.HtmlEncode(html)}; 
      return jsonResult; 
     } 

不過,HTML字符串快到了空白,我期望它包含HTML,通常會通過調用

return PartialView("HospitalDoseList", hospitalStay); 
+0

我會隨你的想法去返回帶有HTML和狀態的json結果,而不是狀態是一個布爾值,如果你想要的不僅僅是一個狀態,它可能會更好一些,使它成爲某種枚舉成功/失敗 – cptScarlet 2009-08-19 01:48:15

+0

當然。這就說得通了。我不知道如何從PartialView調用中獲取HTML字符串。 – 2009-08-19 01:54:33

+0

對不起,我不熟悉MVC,但也許這個鏈接將幫助你。 http://bradwilson.typepad.com/blog/2008/08/partial-renderi.html – cptScarlet 2009-08-19 02:03:55

回答

1

我會建議最簡單的做法是單獨驗證和提交按鈕觸發的後續操作。你首先要做一個AJAX驗證/發佈,返回JSON狀態並且可能會有一個驗證錯誤(字符串)數組。實際上,空白列表可能足以作爲成功的證據,因此您可能會忽略其狀態。一旦你完成了你的服務器端驗證,然後通過AJAX調用另一個動作來檢索要顯示的數據。此操作將呈現局部視圖並返回HTML。

+0

這是一個有趣的想法。但是,我想利用View中的Html.Validation擴展方法,它在ViewData的ModelState中顯示驗證錯誤。 – 2009-08-19 02:36:08

1

我打算在評論堅持這一點,但它是太多的文字...

返回一個AJAX狀態代碼的模式是很常見的,在這裏看看我的帖子:jQuery AJAX Responses in ASP.NET MVC和這篇博客文章: http://www.bennadel.com/blog/1392-Handling-AJAX-Errors-With-jQuery.htm

至於局部視圖,你有點不幸運--ViewResults需要對它們調用ExecuteResult(),然後將它直接呈現給Response。你需要想出一個不同的策略,或許像tvanfosson建議的那樣。

+0

我以爲我看到了一些關於IView.Render的東西,它允許將視圖呈現給響應流以外的內容(例如內存流)。我會做更多的挖掘沿着這些線... – 2009-08-19 03:36:40

+0

我已經做了挖掘..它不會讓你太遺憾。問題是PartialView.View在您調用ExecuteReader()之前爲空,然後如果您嘗試在View上調用Render(),它只會返回一個空字符串,因爲它已被視圖引擎渲染和釋放。如果你確實找到了方法,請發佈。 – womp 2009-08-19 04:13:01