2013年3月28日 星期四

如何解決「一個或多個實體的驗證失敗。如需詳細資料,請參閱 'EntityValidationErrors' 屬性」的問題?

今天遇到「一個或多個實體的驗證失敗。如需詳細資料,請參閱 'EntityValidationErrors' 屬性」的錯誤
手上有的案例是發生在db的table的欄位明明已經加長了,卻忘了update entity的驗證機制
怎麼知道是什麼欄位出問題?
在你的app用debug mode,前端網頁觸發他,我們看一下exception物件有什麼描述吧:

 哇~~exception物件有這麼多屬性,怎麼找到問題出在哪?
 我已經先幫你找到了,先點'System.Data.Entity.Validation.DbEntityValidationExcetion'
 -->EntityValidationErros-->[0](看你有幾個error就都打開來看)-->ValiationError->[0]看一下其中的ErrorMessage 及propertiyName,就有明確的說明錯誤發生在哪,如圖
究竟是bug狠還是我們行?我們慢慢看下去吧....

 喏,你看到了吧,是你的table 欄位已經有加長了,而validation沒有改
打開你的edmx檔,看一下問題出在什麼地方吧:
看到了嗎? buyer_name的欄位只有10,而不是db中的50

一個方式是在edmx的設計畫面找個空白處點滑鼠右鍵,選「update model from database」
一個比較快的方式是直接修改這個MaxLength欄位,改成跟db中的table的欄位相同長度
改完了,別忘了做存檔及專案重建的動作

加映:日後如何加入驗證工作:
書上都有,不過為了方便copy,請直接參考這個鏈結
一例勝萬言:
====================================
This adds a metadata containing class to the class that was generated by the edmx:
[MetadataTypeAttribute(typeof(CustomerMetadata))]
public partial class Customer
{
}
and then you have the metadata class which has the metadata attributes:
internal sealed class CustomerMetadata
{
    public int ID;

    [Required]
    [StringLength(60)]
    public string Name;
}
================================

Extjs msg box alert後再執行的寫法

如果你照API上的寫法
Ext.Msg.alert('Please input Buyer Address', 'Please input Buyer Address',
  function(){....});的話,則會出現還沒按"ok" button就執行function的內容
正確的寫法是:
Ext.Msg.alert('Please input Buyer Address', 'Please input Buyer Address',function(btn){
  ....你的函數....
});
附帶一點,Confirm dialog的寫法也很類似,如下:
Ext.Msg.confirm("Log off !!",
                  "Are you sure you want to exit?",
                  function ( answer ) {
                      if ( answer == 'yes') {
                          .....
                         .....
                          return;                    
                      }else {
                          return;
                      }
                  }
                 );
要注意.

2013年3月25日 星期一

關於Extjs Grid的二三事

1.要做捲動式分頁(infinity scroll)的話,store要設定為buffered,偏偏這會跟summary的特性衝突
如果你一定要有grouppingsummary的特性的話,那就不能用buffered-store

2.summarytype可以是函數,不過要配合「summaryRenderer」來使用才會出現
問題是有時明明在summaryType的function中有很正確的抓到資料了,怎麼在
summaryRenderer中又是NaN ? 答案出在資料格式,
如果該欄位是數字,而你硬要顯示文字(ex: Total:1501),就會有這樣的問題
解決方法除了是在column更改為gridcolumn之外,你的model類別也要對這個欄位進行修改
 
3.明明在server side產生json時,model的順序是對的,怎麼到Grid又出現亂序的問題?
問題是出在store中,必要時設定「sortOnLoad: false」屬性吧

以上,有想到再補充吧
 

2013年3月18日 星期一

extjs 4.1的「請稍候」全畫面遮罩如何設定?

extjs4的Ext.LoadMast(欲罩除元件,訊息);
例:
     var myMask =
       new Ext.LoadMask(me.findParentByType('panel'), { msg: "Please wait..." });
        myMask.show();
  這樣只會罩除到目前元件所在的上層物件
  有時會造成只穿上半身沒穿褲子的感覺
 通常要做遮罩動作時,是整個瀏覽器去做比較安全
(想想,user等不及結果給你切到別的單元去)

所以load mask這樣設定比較好:
        var myMask = new Ext.LoadMask(Ext.getBody(), { msg: "Please wait..." });
         myMask.show();
         ...
         ...
         myMask.hide();
以上,報告完畢




asp.net MVC 與 Extjs的類別路徑整合問題

asp.net 的MVC與extjs的類別整合時,要小心的是把js的資料夾當做是個「control」
這時,只要用router.Ignore的方式來閃避就可以了.
(在app_start資料夾中的RouteConfig.cs加入設定)

另外,我們有必要把一些類別整合出來成為可以常常利用的模型(尤其是model & store)
以下圖:
 我們把store/view/model...這類可能日後在不同單元都會用到的extjs類別都放在一個「ExtjsPackage」資料夾中,並把所有的js依其namespace佈署之
那,在asp.net MVC的view類別中,如果取用?
 除了在_Layout.cshtml中要把ext-all.js & ext的css incluse之外
在asp.net MVC 的view javascript.中,要加上「Ext.Loader.setPath」設定相對關係,以下以範例:
==================================================================
       Ext.onReady(function () {
           Ext.QuickTips.init();
           Ext.Loader.setPath('ExtjsPackage', '/BodhiRestaurantMng/ExtjsPackage');
           var obj = Ext.create('ExtjsPackage.view.pnlContainAll', {
               renderTo: 'MainPanel2PlaceEdit'
           });
       });
========================================================
如果沒有Ext.Loader.setPath的話,在指令「Ext.create('ExtjsPackage.view.pnlContainAll'」時,系統會request的路徑變成「BodhiRestaurantMng/ExtjsPackage/view/pnlContainAll.js」
就會產生404錯誤了
回頭來設定RouteConfig中,是加入這一行:
「 routes.Ignore("ExtjsPackage/{*pathInfo}");」
以上,大家加油吧!!

2013年3月13日 星期三

製作sencha touch app時,如何隱藏令人尷尬的網址列?

如果你來不及包android 或是ios的app,急著上架的話
那請網友用瀏覽器來看吧
(事實上,這些跨平台的底層,也是包個瀏覽器來顯示你的動態網頁罷了)
但是sencha touch的預設是會顯示網址列的,如何把這個令人尷尬的東西隱藏起來呢?
來,到你的sencha architect 右側元件表中,點選「Application」節點,並在你的屬性查詢中輸入「view」

加上「viewport config」


 在viewport Config設定中,設定「 autoMaximized」為 「true」

好,pubish,這樣,網址列就不見了....好看多了吧

2013年3月12日 星期二

mac 的網路分享資料夾設定

除了在「系統偏好設定」中的「共享」設定之外,資料夾本身也要設定共享的user權限
,因為試過光是在「系統偏好設定」中的「共享」設定是無用的
所以應該是以後者--資料夾本身權限設定為優先設定:
注意,「共享檔案夾」要勾選起來 
 接著請到「系統偏好設定」中的「共享」設定:
     設定好之後,在你的win7就可以看到這個網芳了:
   

2013年3月11日 星期一

在sencha architect 2.1如何做出android apk

0,請整理好目錄,因為日後 這很重要.

1,請設定 Architect界面工具列中的「package」所需的條件(中間那項沒成功不要緊,做就是了)



step2,不是急著去build,而是修改「pacakger」的設定:

step 2-1

step 2-2
 「Package Settings Android」有很多事要先做,首先,你要先裝好Ruby for windows, jdk & android sdk,
  (a),到java的bin中去做個keystore,指令如下:
    =============================================
    keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048
   ====================================================
   依照他所提問的,都回答完了,就會在當下目錄中產生一個  keystore.jks
  請把路徑填到 certificatePath中(別忘了路徑斜線的問題)
 (b).android-sdk的路徑填入「sdkPath」欄位中
 (c)「androidAPILevel」是怎麼找的?請到 你的android sdk路徑中,有個platforms目錄
     會出現一堆android-xx的東西, 「androidAPILevel」這欄位後面就要填這個xx值

step3,設定好了packager了,這次,再回到「Sencha cmd setup」按下build鈕
 怎麼跟太監一樣--下面沒有了?
 這是我們tool安裝時順序沒做好之故,正式而言,應該是先裝Ruby for windows再裝Sencha Architect,因為我們顛倒了,所以要自己到「開始」程式中找「start command prompt with Ruby」,用有Ruby加持過的功能,再來執行「sencha package build pacakger.json」的工作

step4:build package:請在start Command Prompt with Ruby的命令視窗中,切換到你的sencha Architect 專案目錄,執行 sencha package build packager.json指令,如下圖:
  
可是....我們明明已經指定是android-10,而且在android-sdk\tools\platform下也有「android-10」平台了啊,怎麼會錯?
別被android sdk騙了,有資料夾未必有下載完全,有還是沒有,請打開SDK-MANAGER.exe,讓他告訴你,如果不是installed,把他裝起來吧:
make sure your SDK platform is installed
 裝完後,再回到Ruby 命令視窗再執行package build 指令 ,如果沒有錯誤訊息,就會出現一個build目錄,裡面有個xxx.apk,就是最後要佈署的成果了
  
step 5,安裝你的apk--佈署到實機上去玩玩看吧:
 (參考文件:http://jinnsblog.blogspot.tw/2011/10/how-to-use-sdk-to-install-apk.html)

 把你的android手機接好usb(當然是已經設定好usb偵錯模式),回到筆電,打開dos視窗,切到 androd-sdk\tools\之下,執行「abd devices」
看一下你的設備有沒有被找到,有的話,就會列出了:
 接著,用adb install來安裝:
哼哼哼,叫你別用太高檔的android API Leve 就是不聽,你看吧
 (這個錯誤是發生在我們之前在sencha architect中 packager 中的「androidAPILevel」設為12之故,問題是我這隻手機只有3.2的SDK....)
  請回去第四步驟調整androidAPILevel及重新build package再回來做adb install工作
  
  終於成功了!! 到你的手機上玩看看辛苦的成果吧
Bodhisrestaurantmobile v1.0

 
  

2013年3月9日 星期六

sencha 2.1 + phoneGap 2.5 to android

1安裝項目 :
 (1)sencha command(download and install SenchaCmd-3.0.2.288-windows.exe)
 (2)phoneGap :2.5.0
 (3)Android SDK: adt-bundle-windows-x86_64.zip
 (4)JDK:1.6.0_39
 (5)ant:apache-ant-1.8.4
2.設定好JAVA_HOME & ANT_HOME
3.在path中設定加入「 %JAVA_HOME%\bin;%ANT_HOME%\bin\  」
   還有 你的android-sdks之下\platform-tools;你的android-sdks之下\tools;你的Sencha.cmd所 在的目錄(以我為例是「C:\Users\John\bin\Sencha\Cmd\3.0.2.288」)
參考以下的網頁,設定:
  http://cclerville.blogspot.tw/2013/01/sencha-touch-21-phonegap-220-android_3.html
 (雖然是mac,不過因為目標都是要包成android專案,所以指令都是一樣的啦)

 最主要的是從sencah create一個app --> phonegap create 相對需要的目錄(注意路徑問題,「build\appName\android\......」之下的順序)
最後是 sencha app build page &&.....的佈署工作

注意!!該中的 「sencha app build package && build/MyApp/android/cordova/debug」
 應改為:
「sencha app build package && build/MyApp/android/cordova/build && build/MyApp/android/cordova/run」

2013年3月2日 星期六

如何在sencha touch 2.1 的iconCls中,加入自己要的按鈕icon呢?

走踏江湖,接案,一定會有時要加入自己的icon
sencha touch 2.1 要加入icon時,不是只有icon丟進folder,還有設定要做,
示範如下(假設我們要加入的是一個cart.png, iconCls 為「cart」):
1.找到你要的icon(黑白),丟到你的resoures的themes\images\default\pictos目錄
2.修改resources下的\themes\stylesheets\sencha-touch\default\widgets中的_buttons.scss
在「@include pictos-iconmask('home');」之下加入
  「@include pictos-iconmask('cart');」
3.故事還沒結束,下載RubyInstaller,目前找到的是「rubyinstaller-2.0.0-p0-x64.exe」
 安裝後,它會有個「Start Command Prompt with Ruby」,打開他
 執行以下的指令:
 「gem install compass」
4.一樣在Ruby的命令視窗中,切到 resources下的sass目錄
   (因為要使用目錄中的config.rb)
  執行「compass compile」或是「compass watch」--讓它監視有沒有修改異動,有則compile
 因為我們修改了_button.scss, compass compile後會在「./../css」中產生更新的css檔

 恭喜,你的sencha class中就可以用這個iconCls了
(註,1你的png檔要先去背,不然還是一個白茫茫的四方塊,這點是靠safari的「開發人員」-->「顯示錯誤主控台」-->「網路」去看到這個png跟其他png檔比較才知道這回事
註2.Sencha Touch 2.2開始使用icon-font方式定義scss,詳細步驟參考2013/11/3 的筆記
)