2013-08-18 52 views
3

我正在使用durandaljs 2.0。我已經按照建議安裝了迪蘭道爾啓動器套件並解釋here。在shell中,我將返回router.activate({ pushState: true });,如相關documentation中所述(請參閱頁面底部)。令人高興的是,該URL確實處於「推送狀態」格式,例如, http://localhost:61285/flickr - 問題是,當我刷新頁面時,出現404錯誤,告訴我「無法找到資源」。如果我將push-state設置爲false(上面的{pushState: false}),我會得到一個散列URL,例如​​- 現在刷新工作。那麼,我應該如何在durandaljs 2.0中設置一個推送狀態模式,以便在刷新時使用?如何在durandaljs 2.0中設置刷新狀態的推送狀態?

感謝,

Elior

+0

看起來你還沒有配置服務器端的處理程序對於http://本地主機:61285/Flickr的? – RainerAtSpirit

回答

3

當您刷新頁面時,瀏覽器會向服務器請求與該URL http://localhost:61285/flickr

可能發生的情況是,如果您使用的是ASP.NET MVC,則服務器試圖找到名爲flickr的控制器,並且會引發異常,因爲顯然沒有任何具有該名稱的資源。

爲了擺脫這個異常你應該配置服務器爲APP提供相同的HTML,但對於未知的URL。這可以通過在ASP.NET中使用IIS URL重寫來實現。

因此,在正確設置服務器之後,通過請求未知的URL,它會返回應用程序的初始視圖以及您在查詢字符串參數中傳遞的任何內容,以便路由器可以在客戶端完成其工作。

In this blog post你會發現更多關於如何配置ASP.NET來處理這種情況的信息。在這篇文章中,作者使用了AngularJS,但是它對於Durandal來說也是一樣的。

-1

RainerAtSpirit和margabit,你們都對,謝謝。下面是我如何實現服務器端:

首先我應該注意,所有與服務器的交互都是通過WebApi控制器完成的。例如,如果URL是: http://localhost:61285/home/category2/subCategory22(對於本地主機),服務器試圖尋找一個名爲'home'的控制器,並在其中調用'category2'。由於沒有這樣的動作,我得到了404錯誤。
我想要的是服務器將調用'home'控制器,但將URL的其餘部分作爲參數發送給客戶端。我的解決方案是在控制器名稱後添加散列,以便URL看起來像這樣:http://localhost:61285/home/#/category2/subCategory22。如果發生這種情況,那麼客戶端將會處理沒有404錯誤的哈希部分。
要發生這種情況:

我將以下內容添加到'網頁。配置':

<的customErrors模式= 「開」 的defaultRedirect = 「錯誤」>
      <錯誤的StatusCode = 「404」 重定向= 「錯誤」/>
< /的customErrors>

然後我在裏面創建一個名爲「ErrorController」與下面的類控制器:

public class ErrorController : ApiController 
{ 
[HttpGet, HttpPost, HttpPut, HttpDelete, HttpHead, HttpOptions, AcceptVerbs("PATCH"), AllowAnonymous] 
    public HttpResponseMessage Handle404() 
    { 
     string [] parts = Request.RequestUri.OriginalString.Split(new[] { '?' }, StringSplitOptions.RemoveEmptyEntries); 
     string parameters = parts[ 1 ].Replace("aspxerrorpath=",""); 
     var response = Request.CreateResponse(HttpStatusCode.Redirect); 
     response.Headers.Location = new Uri(parts[0].Replace("Error","") + string.Format("#{0}", parameters)); 
     return response; 
    } 
} 

發生的事情是,當服務器獲取URL沒有相關的行動正如我上面提到的,它重定向到該控制器採用以下格式:http://localhost:61285/Error?aspxerrorpath=home/category2/subCategory22
你可以看到,我操縱這個補充散列並刪除不必要的信息:http://localhost:61285/home/#/category2/subCategory22並將服務器重定向到「主頁」控制器。
您可能想知道爲什麼我這麼做 - 原因是Durandal是一個很棒的平臺,它使我能夠使用推送狀態,但爲了實現這一點,我必須在服務器上進行非哈希處理儘管沒有相關的控制器/操作,但將其傳遞給客戶端; Durandal會得到一個哈希URL,但會自動刪除哈希,而用戶最終會看到一個無哈希的URL,而Durandal提供所有必要的推送狀態功能。
Elior

+1

感謝您發佈您的解決方案。您可以查看http://www.iis.net/downloads/microsoft/url-rewrite之類的內容,以在IIS上處理它,而不是在WepAPI級別處理它。 – RainerAtSpirit

4

也許晚...但

只是改變了路線配置。 這樣簡單:

routes.MapRoute(
      name: "Default", 
      url: "{*url}", 
      defaults: new { controller = "Home", action = "Index" } 
     );