2011年9月28日 星期三

WebSite 與 WebApplication 偵錯時的路徑問題

當使用WebSite專案時,按下偵錯(F5)後,產生的網址會像是這樣
http://localhost:7788/WebSite1/index.aspx

當使用WebApplication專案時,按下偵錯(F5)後,產生的網址會像是這樣
http://localhost:7788/index.aspx


假設在根目錄下有一的名為MyJS.js的javascript文件需要引用
我們在index.aspx裡面下入以下程式碼
<script type="text/javascript" src="/MyJS.js"></script>

當使用WebApplication專案時,一切都沒有問題
若使用WebSite專案時,就會發生錯誤

原因應該很明顯了 ' / ' 代表網站的根目錄
因為WebSite專案自動幫我們加了一個WebSite1的虛擬路徑
而導致錯誤的發生



解決方法:
1. 打開專案的屬性視窗
2. 將'虛擬路徑'屬性 由原先的 ' /WebSite1 '改成' / '
3. 完成

2011年9月22日 星期四

當網站部屬到IIS後 使用jQuery ajax呼叫webService(.asmx)失敗

在本機開發的時候可以正常呼叫,一但部署到IIS上面就發成錯誤
檢查error status為404錯誤

解決方式:
在web.config加入


<configuration>
  <system.web>
    <webServices>
       <protocols>
          <add name="HttpPost" />
       </protocols>
    </webServices>
  </system.web>
</configuration>

2011年9月6日 星期二

呼叫FacebookWebContext.Current 時跳出 !string.IsNullOrEmpty(settings.AppId) 例外

到web.config的<configuration>區段裡面加入以下程式碼:
<configSections>
<section type="Facebook.FacebookConfigurationSection, Facebook" name="facebookSettings"/>
<section name="canvasSettings" type="Facebook.Web.CanvasConfigurationSettings, Facebook.Web" />
</configSections>
<facebookSettings appId="你的appId" appSecret="你的appSecret" />
<canvasSettings
canvasPageUrl="http://apps.facebook.com/smartbuttonthree/"
canvasUrl="https://preview.smartbutton.com/dev/"
authorizeCancelUrl="http://www.facebook.com"/>

注意:<configSections>區段必須放在<configuration>的下面,也就是只能為<configuration>的第一個子區段

2011年8月26日 星期五

使用 Entity Framework 查詢出來的是舊資料?

使用entity framework也有幾個月的時間了
因為一開始是在web上開發,後來到win form上面才發現到這個問題
一個簡單的程式如下:


pubilc class Demo
{
private DemoEntities _db = new DemoEntities();

public void Query()
{
var enumProducts = from product in _db.Products
select product;
}
}


當第一次執行Query()時,查詢出來的資料都是正確的
之後手動到資料庫去變更Products資料表中的資料後
當執行第二次Query()後,發現查詢出來的還是之前的資料

原來每個ObjectSet都會自己維護查詢後的資料,也就是會將查詢後的資料放在物件中
在ObjectSet中有一個稱為MergeOption的屬性,是用來處理新查詢結果和物件中資料的合併方式

有四種狀態如下:
AppendOnly(預設):有查到新的資料列就新增到物件中,若資料表有變更過的資料列,並不會更新到物件中。
OverwriteChanges:不管資料表中的資料列是新增或是修改過,都覆蓋原先物件中的資料。
PreserveChanges:不管資料表中的資料列是新增或是修改過,都覆蓋原先物件中的資料,但原先物件中的某筆資料的狀態如果為modified則不會被覆蓋。
NoTracking:不維護物件中的資料。

以上為不精確的解釋,詳情請參考

最後補充一下為什麼用web開發時沒遇到這個情形
因為每要求一次頁面就會重新建立DemoEntities所以維護的資料都重新來過,就不會發生這種問題

所以除了AppendOnly狀態以外自己看情況選擇其他的狀態吧

對了對了 ObjectSet還有一個Method叫Refresh() 可以動態決定什麼時候要更新,有興趣在研究吧~

2011年7月28日 星期四

圖片被AdBlock隱藏了 =.= 換個方式顯示吧

在設計網頁的時候 因為瀏覽器裝了 adblock 套件
當路徑含有ad or ads 等廣告字樣 圖片就顯示不出來了

後來發現當html tag 為 <img>的時候會有這個問題
引此將圖片改為用 <input type="image" style="cursor:default" onclick="return false;"> 顯示就可以了

style="cursor:default" //因為用input type=image表是為圖示按鈕,所以由標會以手指顯示,加入這行讓游標變成箭頭

onclick="return false;" //因為用input type=image表是為圖示按鈕,為了防止點了圖片就做出submit動作,加入這行讓submit事件無效

2011年7月21日 星期四

一些在Windows Installer時,撰寫Registry會用到的保留字

最常用的應該就是
[TARGETDIR] //此保留字,表示程式安裝的路徑

其他... 嗯... 太多了自己看

http://msdn.microsoft.com/zh-tw/library/aa370905.aspx

2011年4月14日 星期四

使用chrome或firefox,無法在ashx中取得session

問題1:
當context.Session = null,是因為少繼承了IRequiresSessionState介面
於是需改成

using System.Web.SessionState;

public class Handler : IHttpHandler, IRequiresSessionState
{ ... }

問題2:
雖然context.Session != null了,但是Session.Count = 0,無法取得由aspx所設定的session值
於是需在 web.config 中加入

<configuration>
<system.web>
<sessionState cookieless="UseUri" />
</system.web>
</configuration>

OK! 可順利取到值了