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 action="xxx.php" method="post"  onsubmit="return false;">
</form>
參考來源
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 {

    <script>
        $(function () {

            $.ajax({
                url: '@Url.Action("TestGet", "Home")',
                type: 'post',
                data: { q: '傳到後端再顯示的!!' },
                async: false,
                success: function (data) {
                    alert(data);
                }
            });
        });

    </script>
}

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

2015年5月13日 星期三

Bootstrap Multiselect

接到一個功能是要多選checkbox
忽然想到能不能下拉select 時有checkbox
在網路上找到bootstrap-multiselect
功能相當齊全使用也簡單給需要的人參考
加入參考
<link href="/css/bootstrap-multiselect.css" rel="stylesheet" type="text/css" />
<script src="/js/bootstrap-multiselect.js" type="text/javascript"></script>
Html部份
<select  id="selecttest" multiple="multiple">
略...
</select>
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是必備的
<div>
        <ul id="lst"></ul>
    </div>
    <script src="/Scripts/jquery-1.11.2.min.js"></script>
    <script src="/Scripts/jquery.signalR-2.0.1.js"></script>
    <script src="/signalr/hubs"></script>
6.撰寫JS,比較需要了解的對應Server的呼叫及Server如何呼叫Client
    <script type="text/javascript">

        $(function () {
            //建立與Server端的Hub的物件,注意Hub的開頭字母一定要為小寫
            var onlineHub = $.connection.myHub;

            //將連線打開
            $.connection.hub.start().done(function () {                   
                onlineHub.server.userConnected(location.href, navigator.userAgent);//呼叫server
            });


            //讓server呼叫(抓取資料)
            onlineHub.client.getList = function (userList) {

                //內容自由發揮
                var HasObj = $('#lst');
                if (!HasObj.length)
                    return;

                $("#lst").html("");
                var li = "";
                $.each(userList, function (index, data) {
                    li += "<li id='" + data.id + "'>ip:" + data.ip + "-Url:" + data.url + "-Brower:" + data.browser + "</li>";
                });
                $("#lst").html(li);
            }

            //讓server呼叫(移除離開人員) 
            onlineHub.client.onUserDisconnected = function (id) {
                //內容自由發揮
                $('#' + id).remove();
            }

           
        });
    </script>
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"

    <supports-screens
        android:largeScreens="true"
        android:normalScreens="true"
        android:smallScreens="true"
        android:xlargeScreens="true"
        android:resizeable="true"
        android:anyDensity="true"
        />

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.RECORD_VIDEO"/>
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />   
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />   
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
             android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"  >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
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日 星期一

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

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

2015年1月22日 星期四

Angular 搭配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<Sys_Domain> data = new List<Sys_Domain>();
            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日 星期四

Angular 分頁

最近又開始使用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;
<#
}
#>
    }
有更好的解法再等大家提供喔!!