2011-03-28 70 views
7

我有一個控制器操作,它在數據庫中執行一些工作,然後在完成時退出。這個動作通過jQuery的ajax函數被調用,dataType設置爲'json'。ASP.NET MVC - 處理沒有返回對象的Ajax操作的正確方法

如果我把操作設置爲無效的返回類型,一切都將發揮作用,除了火狐就好將顯示在說,控制檯的錯誤:「找不到元素」。

如果期望XML回來,Firefox會拋出這個錯誤是有道理的。但是,即使我將ajax調用的dataType屬性更改爲「text」,我仍然收到錯誤。爲了擺脫返回類型爲void的錯誤,我必須將Response的ContentType設置爲「text/html」。或者我可以將返回類型設置爲JsonResult並返回一個新的[empty] JsonResult對象。

我敢肯定,有幾種方法,我可以讓這個錯誤消失,但我想知道來處理,沒有通過AJAX調用的返回值行動的正確方法。

如果很重要,我還使用異步控制器操作模式。

public void DoSomethingAsync(SomeJsonObjectForModelBinding model) 
{ 
    // do some database things 
} 

public void DoSomethingCompleted() 
{ 
    // nothing to do... 
    // what should my return type be? 
    // do I need to set the content type here? 
} 

回答

11

我知道這並不完全回答你的問題,但我認爲你應該始終有一個返回值從AJAX或Web服務調用回來。即使只是告訴你操作成功,或者將錯誤(消息)返回給你。

我經常定義一個類是這樣的:

public class JsonResultData 
{ 
    private bool _success = true; 
    public bool Success 
    { 
     get { return _success; } 
     set { _success = value; } 
    } 

    public object Value { get; set; } 
    public List<string> Errors { get; set; } 


    public JsonResultData() 
    { 
     this.Errors = new List<string>(); 
    } 
} 

,然後用它來在JsonResultData包裝,像這樣返回數據或任何其他呼叫元數據:

return new JsonResult { 
      Data = new JsonResultData { Value = returnValue, Success = true } 
      }; 
+1

+1總是返回成功或錯誤,對於js的工作方式來說確實非常必要。 – 2011-03-28 18:49:18

+2

我不明白這是什麼購買你。無論如何,服務器始終會返回http狀態。即使你知道它永遠不會被讀取,你仍然主張json將json序列化數據發送給客戶端。重點是什麼? – fearofawhackplanet 2011-11-23 17:01:46

+1

好吧,系統級反饋,然後是應用程序級的反饋。您可以成功執行AJAX,但不知道應用程序中服務器端是否出現問題。 – Kon 2011-11-28 16:01:06

0

我不能因爲我的聲譽而發表評論,但我仍然想幫助清除Kon的答案中的混淆。

在一種應用我抓住一個ActionMethod之內的所有的異常,設定HttpStatusCode並添加一個錯誤消息到響應。我提取了Ajax錯誤函數中的消息並將其顯示給用戶。

一切工作正常,直到應用得到了把臨時服務器,誰有着某種設置,並沒有讓錯誤響應中返回消息上。相反,一些標準的Html傳輸導致JS錯誤處理響應。

最後,我不得不重寫我所有的異常處理返回我的應用程序錯誤,因爲成功的Ajax調用(它實際上是),然後阿賈克斯成功函數中不同,現在的樣子是應該的。

你應該混合系統級和應用級的反饋。您可能無法以應用程序需要的方式控制系統級別的反饋。

相關問題