2010-04-10 51 views
0

我想知道是否可以將視圖作爲JSON對象返回。在我的控制器我想要做的東西像下面這樣:可以將一個視圖作爲ASP.Net中的JSON對象返回MVC

 [AcceptVerbs("Post")] 
     public JsonResult SomeActionMethod() 
     { 
      return new JsonResult { Data = new { success = true, view = PartialView("MyPartialView") } }; 
     } 

在HTML:

$.post($(this).attr('action'), $(this).serialize(), function(Data) { 
         alert(Data.success); 
         $("#test").replaceWith(Data.view); 

        }); 

任何反饋不勝感激。

回答

3

我真的不推薦這種方法 - 如果您想確保調用成功,請使用協議中和jQuery庫中內置的HTTPHeader。如果你看看$.ajax的API文檔,你會發現你可以對不同的HTTP狀態代碼有不同的反應 - 例如,成功和錯誤回調。 用這種方法,你的代碼將看起來像

$.ajax({ 
    url: $(this).attr('action'), 
    type: 'POST', 
    data: $(this).serialize(), 
    dataType: 'HTML', 
    success: function(data, textStatus, XMLHttpRequest) { 
       alert(textStatus); 
       $('#test').html(data); 
      }, 
    error: function(XmlHttpRequest, textStatus, errorThrown) { 
       // Do whatever error handling you want here. 
       // If you don't want any, the error parameter 
       //(and all others) are optional 
      } 
    } 

而且操作方法簡單地返回PartialView

public ActionResult ThisOrThat() 
{ 
    return PartialView("ThisOrThat"); 
} 

但是,是的,這是可以做到的方式太。您的方法存在的問題是您要返回PartialView本身,而不是輸出HTML。如果你把它改成這樣您的代碼將工作:

public ActionResult HelpSO() 
{ 
    // Get the IView of the PartialView object. 
    var view = PartialView("ThisOrThat").View; 

    // Initialize a StringWriter for rendering the output. 
    var writer = new StringWriter(); 

    // Do the actual rendering. 
    view.Render(ControllerContext.ParentActionViewContext, writer); 
    // The output is now rendered to the StringWriter, and we can access it 
    // as a normal string object via writer.ToString(). 

    // Note that I'm using the method Json(), rather than new JsonResult(). 
    // I'm not sure it matters (they should do the same thing) but it's the 
    // recommended way to return Json. 
    return Json(new { success = true, Data = writer.ToString() }); 
} 
+0

感謝托馬斯 - 我很欣賞的指針再度最佳實踐,但我不是在看200或500錯誤。這更適合驗證我返回成功的位置,然後返回相關的局部視圖。有成功和失敗的觀點,但是我仍然需要在返回結果後在頁面的其他地方做一些處理。我儘可能簡單地舉例說明技術答案,而不是設計方案。再次感謝你的回覆! – Chev 2010-04-11 06:48:20

+0

托馬斯 - 使用mvc 1.0我沒有訪問ControllerContext.ParentActionViewContext屬性? – Chev 2010-04-11 10:57:40

+0

嗯......我所展示的代碼顯然來自於.NET 4的MVC 2,因爲這正是我正在使用的。我將在MVC 1中查看一些方法 - 但我的搜索算法將是「ah,intellisense - 嗯,這是什麼?」,所以你可以儘可能地發現它:P – 2010-04-11 11:45:36

0

你爲什麼要返回封裝在JSON對象中的視圖? 它可能會工作,但它是下一個開發人員說「WTF?!?」的開放門戶。

爲什麼不只是讓你的行動回報PartialView調用$獲得()和注射,或甚至更優質的通話

$("#target").load(url); 

編輯:

好吧,既然你要發送的值,你可以使用獲取或加載,顯然,但你的方法仍然沒有多大意義... 我想你會應用一些變化取決於你的json對象中的成功變量,你的回報。但是,您最好在服務器端保留這種邏輯,並根據您的條件返回一個視圖或另一個視圖。例如,您可以返回一個JavascriptRersult,例如一旦它被檢索到就會執行一段JavaScript ...或返回2個不同的PartialViews。

+0

感謝您的答覆斯蒂芬 - 請我評論托馬斯的後上方 – Chev 2010-04-11 06:50:12

相關問題