2013年7月14日 星期日

找不到必要的 .Net Framework Data Provider。可能尚未安裝。

建立一個新的網際網路應用程式,想要使用原本已經建立好的資料庫時,我在專案上加入了【ADO.NET 實體資料模型】(Entity Framework)並連結到要使用的資料庫

























確定後在web.config產生連結字串











以上為 database-first
----------------------------------------------------------------

在指定的資料庫裏面有一個資料表Users,想要讓WebSecurity使用時修改了
WebSecurity.InitializeDatabaseConnection("DefaultConnection""UserProfile""UserId""UserName", autoCreateTables: true);
WebSecurity.InitializeDatabaseConnection("TestDbEntities""Users""UserId""UserName", autoCreateTables: true);

我將預設產生的DefaultConnection改為TestDbEntities是,並將UserProfile資料表改為Users

開始執行網站,當執行到上面這段修改過的程式時, 發生錯誤:

找不到必要的 .Net Framework Data Provider。可能尚未安裝。


看來membership服務認不出entity framework的連結字串,因此將連結字串改回用DefaultConnection,並修改內容:
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=TestDb;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />



2013年7月2日 星期二

自訂DataType的錯誤訊息(ErrorMessage)

對欄位進行格式驗證通常會使用如下方式 :
[DataType(DataType.EmailAddress, ErrorMessage = "請輸入正確電子郵件")]
public string Email { getset; }
執行時, 格式驗證功能正常, 但是錯誤訊息還是顯示英文, 可改用 :
[EmailAddress(ErrorMessage="請輸入正確電子郵件")]



2013年7月1日 星期一

ASP.NET MVC使用AJAX方式撈取資料

1.可能要撈取的條件不只是一筆資料, 例如使用兩部電影ID去撈取各自的資料, 因此在jQuery組成JSON字串

        // 撈出頁面資料放到陣列
        var $video = $('.video');
        var videoIdArr = [];
        $video.each(function (index, element) {
            videoIdArr.push($(element).attr('data-videoid'));
        });
        videoIdArr = $.unique(videoIdArr);
        var url = '@Url.Action("GetVideos", "Video")';
        // 使用JSON.stringifyJavaScript值轉換成以JSON表示的字串
        var data = { videoIds: JSON.stringify(videoIdArr) };
 
        // dataservicereturnJSON 格式之內容
        $.post(url, data, function (data) {
            $(data).each(function (index, element) {
                $('.video_' + element.VideoID).text(element.Name);
            });
        });

        // MVCController Action :
        [HttpPost]
        public ActionResult GetVideos(string videoIds)
        {
            var db = new HappyMovieEntities();
            var Serializer = new JavaScriptSerializer();
 
            // 將指定的 JSON 字串轉換成 T 型別的物件。
            // (此範例是將videoIds轉換成List<string>)
            var _videoIds = Serializer.Deserialize<List<string>>(videoIds);
            var query = db.Video.Where(x => _videoIds.Contains(x.VideoID)).Select(x => new
            {
                x.VideoID,
                x.Picture,
                x.Name,
                ReleaseYear = x.ReleaseDate.Value.Year,
            });
            return Json(query);
        }

* 備註 :
因為Action裡面有解序列化的程式, 所以接收的資料一定要是Json格式的字串
如果要client端發送的只有一筆可以這樣寫 :
        var vid = '@Model.VideoId';
        var data = { videoIds: JSON.stringify([vid]) };
如果不傳入資料 :
        var data = { videoIds: undefined };
但是server端要加入判斷是否接收到的是null
-----------------------------------------------------------------------------------
1. 使用 autocomplete (jQuery UI)
        // 輸入文字搜尋人名
        $('#search_user').autocomplete({
            source: "@Url.Action("UserName""Search")",
            minLength: 2,
            select: function (event, ui) {
                $('#ReceiverId').val(ui.item.id); // 將真正的值放到指定元素
            }
        });

        // MVCController Action :
        // autocompelete送出的請求url : UserName?term=
        // 所以接收的參數必須命名為 term
        public ActionResult UserName(string term)
        {
            var _db = new HappyMovieEntities();
            var query = _db.UserProfile.Where(x => x.NickName.Contains(term))
            .OrderBy(x => x.NickName)
            .Select(x => new
            {
                id = x.UserId, // 真正的值
                label = x.NickName, // 顯示於搜尋結果
                value = x.NickName, // 被選取後帶回欄位的值
            });
            return Json(query, JsonRequestBehavior.AllowGet);
        }


使用LINQ取每個群組的前幾筆資料


from x in TopicItems
group x by  x.TopicId into g
select new {
    g.Key, 
    Items = g.OrderBy(x => x.Seq).Take(3) 
};