2015年10月1日 星期四

Asp.net MVC Bootstrap submit confirm Button loading(20)

有時在批次執行一些動作時會持續很久
要怎麼讓按紐變成Loading讓使用者不會重複按
@using (Ajax.BeginForm("action", "controller", null, new AjaxOptions { HttpMethod = "POST", OnSuccess = "OnSuccess", OnBegin = "OnBegin" }))
{
 
}
寫兩個function OnBegin OnSuccess
一個是在執行submit前一個在後
加上confirm讓使用者有感

        var btn = $('#MultipleCreate');

        function OnBegin() {
            if (!confirm('確定批次新增嗎??')) return false;
            btn.button('loading');
        }

        function OnSuccess(response) {
            btn.button('reset');
            alert('完成');           
        }

2015年7月16日 星期四

SQL 取得identity資訊

目前想試寫一個排程同步的軟體
預到的第一步就是identity問題
找了一下網路如可簡單組出已下
select 
IDENT_SEED('table_name') as 起始值,
IDENT_INCR('table_name') as 每次增值, 
IDENT_CURRENT('table_name') as 目前最大值  
重置indentity
dbcc checkident('table_name', RESEED, 100) 
Insert後取得indentity
Select @@Identity
參考來源
請問要去那個資料表查出自動編號 IDENTITY (x,y ) 的起始值(x)及增量
SQL Server的Identity字段使用/复制/重设
Usage of IDENT_INCR and IDENT_SEED function of Identity column in sql server

2015年7月11日 星期六

SQL smalldatetime or datetime抓當天

有時候資料庫欄位會開smalldatetime 或datetime
但是在select的時候程式若為區間那可能就會抓00:00~2359這樣下程式語法
datediff搭配只需輸入
select a.* 
from table as a
Where 
datediff(dy, a.xxx, '2015-07-10') = 0

2015年6月5日 星期五

c# INotifyPropertyChanged實作

網路上已經有許多INotifyPropertyChanged的文章
看了許多但還是不太懂所以看著msdn實作了一次
1.先新增一個class
        public int id { get; set; }
        public string name { get; set; }
2.將class繼承INotifyPropertyChanged
        using System.ComponentModel;
        public class member : INotifyPropertyChanged
3.實作INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
4.修改class
  public int id { get; set; }

        private string _name;
        public string name
        {
            get { return this._name; }
            set
            {
                if (value != this._name)
                {
                    this._name = value;
                    NotifyPropertyChanged("Name");
                }
            }
        }
5.新增一個list(抓假資料如果是資料庫也可直接改)
  public List GetMember(int pCount)
        {
            List lst = new List();
            string name = "test";
            for (int i = 0; i < pCount; i++)
            {
                member create = new member()
                {
                    id = i,
                    name = name + i.ToString()
                };
                lst.Add(create);
            }
            return lst;
        }
6.抓出資料
 member script = new member();
 List lst = script.GetMember(10);
 dataGridView1.DataSource = lst;
7.寫另一個頁面去修改name
會發覺改了後dataGridview1的name也會跟著改
太神奇又好用了
參考網址
HOW TO:實作 INotifyPropertyChanged 介面
範例下載
INotifyPropertyChanged實作

2015年6月3日 星期三

Html5 Form內按Enter無效

有時用jQuery或其他方式自訂了Enter的function後會不需要form的submit
參考來源
FORM内でのEnter無効化

2015年5月29日 星期五

Visual Studio Entity Framework6 自定連線字串

繼上次Visual Studio Entity Framework 設定連線字串問題
目前網路上找到比較適合我的方式
修改Model中xxx.Context.cs
 
public xxxEntities()
   : base("name=xxxEntities")
{
}
改成如下後就能自帶Connection string
 
public xxxEntities(string ConnectionString)
            : base(ConnectionString)
        {
        }   
但上篇所提到的Model如果更新就會被改掉
所以要修改xxx.Context.tt
如果沒把握或看不懂千萬別亂改喔!!
找到
 
public <#=code.Escape(container)#>()
        : base("name=<#=container.Name#>")
    {
改成
 
 public <#=code.Escape(container)#>(string ConnectionString)
        : base(ConnectionString)
    {
使用方式如下
 
//自行加密
private static string conn = string.Format("metadata=res://*/Models.Model1.csdl|res://*/Models.Model1.ssdl|res://*/Models.Model1.msl;provider=System.Data.SqlClient;provider connection string=\";data source={0};initial catalog={1};user id={2};password={3};MultipleActiveResultSets=True;App=EntityFramework\";", "datasource", "catalog", "id", "pw");
private xxxEntities db = new xxxEntities(conn);
要注意的是以下符號改為雙引號,這樣進行字串加密
& q u o t 
參考來源
Passing Connection String to Entity Framework 6

2015年5月20日 星期三

Asp.net MVC jQuery常用範例(19)

因公很久沒寫MVC了都忘了
最近練了許多jQuery的東西想說MVC到時能做結合所以想到先做一個筆記
想到就加摟
1.如何將資料傳到後端(主要是Url.Action)
@section scripts {

    
}

        [HttpPost]
        public ActionResult TestGet(string q)
        {
            return Content(q);
        }

2015年5月13日 星期三

Bootstrap Multiselect

接到一個功能是要多選checkbox
忽然想到能不能下拉select 時有checkbox
在網路上找到bootstrap-multiselect
功能相當齊全使用也簡單給需要的人參考
加入參考


Html部份

js部份

            $('#selecttest').multiselect({
                includeSelectAllOption: true,
                selectAllText: '全選',
                nonSelectedText :'未選擇',
                allSelectedText : '已全選'
            });

還有許多屬性可以使用
如果都沒有時select的val()是null

2015年4月8日 星期三

jQuery Table中CheckBox全選

我想這功能應該被寫爛了
但我常遇到一個畫面有好幾個table
這樣每個都需要寫一次
這樣很麻煩程式碼也很長
            <table>
                <thead>
                    <tr class="active">
                        <th>
                            <label>
                                <input type="checkbox" class="selectAll" />全選</label>
                        </th>                       
                    </tr>
                </thead>
                <tbody>
                   <tr>
                      <td>
                          <input type="checkbox" />
                      </td>
                   <tr>
                   <tr>
                      <td>
                          <input type="checkbox" />
                      </td>
                   <tr>
                   <tr>
                      <td>
                          <input type="checkbox" />
                      </td>
                   <tr>
                   <tr>
                      <td>
                          <input type="checkbox" />
                      </td>
                   <tr>
                </tbody>
             </table>

計畫是抓到這個checkbox的父table再向下抓
closest這個語法可以查到指定的最上層
然後再用find向下找
程式依文字解讀就變下面
   $('.selectAll').change(function () {              
               $(this).closest('table').find('tbody tr td input[type="checkbox"]').prop('checked', $(this).prop('checked'));
   });
這樣只要checkbox class指定好不管多少table都能共用
參考來源
.closest() | jQuery API Documentation

2015年4月7日 星期二

jQuery Table合並儲存格

一早接到一個需合併儲存的功能 搜尋了一下找到一個與法簡單又相當好用的 jquery請參考jQuery : 分享合併Table的欄位 (RowSpan、ColSpan) 語法

 $(function () {
      $('.tbspan').rowspan(1);//第幾個欄位做合併 0開始           
      $('.tbspan').rowspan(4, 0); //(合並那一個,那一個欄位一樣)    
      $('.tbspan').colspan(3);//第幾列做合併 0開始
});
參考來源
jQuery colspan and rowspan table using cell break
jQuery : 分享合併Table的欄位 (RowSpan、ColSpan) 語法

2015年3月26日 星期四

Asp.net 將所有物件變ReadOnly,及變回來

目前很少直接使用asp.net的control
大多使用jquery + html方式來做
同事問到是否能將所有control變readonly
花了幾分鐘寫了以下的function希望對大家有幫助
變ReadOnly
  void ReadOnlyControl(Control control)
        {
            foreach (var item in control.Controls)
            {
                if (item is System.Web.UI.WebControls.TextBox)
                {
                    TextBox ctrl = (TextBox)item;
                    ctrl.ReadOnly = true;
                }
                else if (item is System.Web.UI.WebControls.DropDownList)
                {
                    DropDownList ctrl = (DropDownList)item;
                    ctrl.Enabled = false;
                }
                else if (item is System.Web.UI.WebControls.CheckBox)
                {
                    CheckBox ctrl = (CheckBox)item;
                    ctrl.Enabled = false;
                }
            }
        }        
變回來
 void WriteControl(Control control)
        {
            foreach (var item in control.Controls)
            {
                if (item is System.Web.UI.WebControls.TextBox)
                {
                    TextBox ctrl = (TextBox)item;
                    ctrl.ReadOnly = false;
                }
                else if (item is System.Web.UI.WebControls.DropDownList)
                {
                    DropDownList ctrl = (DropDownList)item;
                    ctrl.Enabled = true;
                }
                else if (item is System.Web.UI.WebControls.CheckBox)
                {
                    CheckBox ctrl = (CheckBox)item;
                    ctrl.Enabled = true;
                }
            }
        }

使用方式
ReadOnlyControl(form1);
WriteControl(form1);

2015年3月17日 星期二

FancyBox 按ESC或點背景無效方式

User有時候會不小心按了ESC或者是不小心點了背景
然後輸入的資料都不見了
為了防止種事發生
            $('.fancybox').fancybox({
                closeBtn: false, // 是否顯示關閉按紐               
                helpers: {
                    // 防點擊背景時關閉
                    overlay: { closeClick: false }
                },
                keys: {
                    // 防點擊ESC時關閉
                    close: null
                }
            });
參考來源
DISABLE FANCYBOX BOX CLOSE WITH BUTTON, OVERLAY CLICK AND ESCAPE KEY

2015年2月12日 星期四

SignalR 第一次使用就上手!!實作即時在線人員

第一次使用就上手!!
如果有這種人那就是高手了,小弟是用了一天才會
重點整理
原為1.x升到2.x方式

目前是想說用SignalR來做一個線上人數的統計,asp.net 使用Application和Session物件統計線上人數一般都會這樣做
後來想一下使用SignalR來做的話是不是對系統效能會好點
1.首先使用NuGet安裝SignalR(安裝方式網路有許多不另教學)
2.新增一個類別,SignalR Hub類別,如果非沒有這項的話也可以新增一個類別
加入以下
using Microsoft.AspNet.SignalR;
public class MyHub : Hub
3.新增一個Class來紀錄使用者資訊
   public class UserData
    {
        public string id { get; set; }
        public string ip { get; set; }

        public string url { get; set; }

        public string browser { get; set; }
    }
4.撰寫Server後端的Class
   public class MyHub : Hub
    {
        //目前所有連線的list
        static List UserData = new List(0);

        public void userConnected(string pUrl, string pBrowser)
        {
            //使用者連線 加入清單
            var query = from u in UserData
                        where u.id == Context.ConnectionId
                        select u;

            if (query.Count() == 0)
            {   //這段自由發揮
                UserData.Add(new UserData { id = Context.ConnectionId, ip = PublicClass.GetIpAddress(), url = pUrl, browser = pBrowser });
            }
            Clients.All.getList(UserData);//呼叫前端function
        }

        public override Task OnDisconnected()
        {
            //離開時清除清單
            Clients.All.removeList(Context.ConnectionId);

            var item = UserData.FirstOrDefault(x => x.id == Context.ConnectionId);
            if (item != null)
            {
                UserData.Remove(item);//刪除                
                Clients.All.onUserDisconnected(item.id);  //呼叫前端function       
            }
            return base.OnDisconnected();
        }

    }
5.前端的Html及加入參考
需先參考jQuery,再參考SignalR
後面/signalr/hubs是必備的
    6.撰寫JS,比較需要了解的對應Server的呼叫及Server如何呼叫Client
        
    
    7.如果為2.0版本需新增一個Owin啟動類別並加入
     public void Configuration(IAppBuilder app)
            {
                
                app.MapSignalR();  
            } 
    
    如果為1.0在Global.asax加入
        protected void Application_Start(object sender, EventArgs e)
            {
                RouteTable.Routes.MapHubs();
            }
    
    了解運作方式後其實可以做其他許多功能,以上如有錯誤請告知謝謝!!
    參考來源
    [轉貼&下載]SignalR聊天室 / 升級SignalR v2的步驟
    [.NET]SignalR簡介 - 建立 realtime 的網站
    SignalR 再次超越你對 Web 的想像 - 建立即時互動的 Web
    悠閒 Coding 系列 (一) - 認識 SignalR 建立 realtime 網頁
    點我下載範例

    2015年2月10日 星期二

    Android 安裝PhoneGap 2.9.0

    安裝完Cordova後覺得好像還是用eclipse來開發PhoneGap比較順
    雖然平常的開發工具都是VS系列
    可能是對於Cordova資料夾內容還不是很熟

    1.New Android Application Project 然後就跟跟一般的方法一樣這邊簡略...
    2.下載phonegap解壓
    3.到lib > android > example 裡將資料cpoy到eclipse裡
    assets/www
    libs/cordova-2.9.0.jar
    res/xml

    4.cordova-2.9.0.jar右鍵如下圖

    5.開啟AndroidManifest.xml將exmaple裡supports-screens 及uses-permission android:name都copy貼上
    activity裡加入 android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    
        
    
        
        
        
        
        
        
        
        
        
        
        
           
           
        
        
        
        
        
            
                
                    
    
                    
                
            
        
    
    6.MainActivity裡修改
    package com.example.test;
    
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    
    import org.apache.cordova.*;//import
    
    public class MainActivity extends DroidGap {//改public DroidGap
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //setContentView(R.layout.activity_main);
            super.loadUrl("file:///android_asset/www/index.html");//加入
    
        }  
    }
    
    至於為何要使用2.9.0,因為3.0以上改為node.js來安裝,2.9.1裡面無jar檔試了一下怎麼裝都起不來
    參考網站:
    PhoneGap 教學 - Hello World
    範例下載

    Visual Studio 開發Corodva前需額外安裝項目

    今天心血來潮想使用VS2013開發Cordova
    新增專案後會提示需安裝Multi-Device Hybrid Appsok下載
    執行後又出現警告需安裝2013 update4ok下載..
    執行後又出現警告需安裝Management Frameworkok下載...

    裝完以上三個後終於出現安裝頁面^ ^Y

    2015年1月26日 星期一

    Web Api 405 - 不允許用來存取此網頁的 HTTP 指令動詞

    今天終於將AngularJs + web api基本的CRUD寫好了包括一下未來可能會遇到功能
    發怖到了IIS主機後才發現無法修改及刪除
    因為網頁原本就只有Get Post,但沒有Put跟Delete兩種 網站上有許多方法及相關解法
    例如設定WebDAV等等..試了也沒用
    找了一篇如下參考網站直接修改WebConfig
    找到如下
     
    
        
        
    .....
    
    修改成
     
    
      
        
        
          
        
    .....
    
    .....以下空的
    參考網站
    405 Method Not Allowed using ASP.NET Web API

    2015年1月22日 星期四

    AngularJS 搭配Web Api回傳問題

    今天遇到的問題是使用angularjs抓取web api
    在一開始都沒問題網路上很多範例如下
    js部份
     
        $http.get('/url').success(function (data, status, headers, config) {
            $scope.datalists = data;
        })
        .error(function (data, status, headers, config) {       
            $scope.error = "Error!!";
        });
    
    web api .cs部份 vs自動產生很快吧!!
     public IEnumerable Get()
    {       
      return  db.Sys_Domain.AsEnumerable();       
    }
    
    但是其實這個table join了很多Table當被join的table裡開始有資料時就會有錯誤
    找了許多方式修改了web api
          public HttpResponseMessage Get()
            {
                List data = new List();
                foreach (var item in db.Sys_Domain)
                {
                    Sys_Domain Row = new Sys_Domain()
                    {
                       //todo
                    };
                    data.Add(Row);
                }
                return Request.CreateResponse(HttpStatusCode.OK, data);
            }
    
    就可以正常的回傳了剛學習,如有更好的方式再請大家多指教!!

    2015年1月15日 星期四

    AngularJS 分頁

    最近又開始使用AngularJS之前有練習過,但沒機會實戰
    目前開始建構一個專案主要使用AngularJS
    原文網址
    show more , prev and next , pager
    jsfiddle
    show more , prev and next , pager
    早上測試一下套用的方式相當簡單一下就套上了分享給大家
    加入filter
    Angularjs - Pagination appear after search filter

    2015年1月14日 星期三

    Visual Studio Entity Framework 設定連線字串問題

    繼之前連線字串加密問題後
    今天使用vs2013開發新增一個ADO .net 實體模型
    後來無法自定連線字串
    找了一下 有關Entity Framework在程式中給連線字串這篇也遇到同樣的問題
    後來與同事討論有幾種改法
    1.修改xxx.Context.cs
     
     public xxxEntities()
       : base("name=xxxEntities")
    {
    }
    
    把name=xxxEntities改成需要的conectionstring如果有加解密可以寫一個function去呼叫
    這樣就沒事了嗎錯!!!
    如果model改了剛寫的都白寫了

    2.修改xxx.Context.tt
    修改範本方式找到以下做修改成需要的
    但如果不是很有把握千萬別亂修改
    找到如下
     
    public <#=code.Escape(container)#>()
            : base("name=<#=container.Name#>")
        {
    <#
    if (!loader.IsLazyLoadingEnabled(container))
    {
    #>
            this.Configuration.LazyLoadingEnabled = false;
    <#
    }
    #>
        }
    
    修改成
     
     public <#=code.Escape(container)#>()
            : base(你要的function)
        {
    <#
    if (!loader.IsLazyLoadingEnabled(container))
    {
    #>
            this.Configuration.LazyLoadingEnabled = false;
    <#
    }
    #>
        }
    
    有更好的解法再等大家提供喔!!