Thứ Năm, 4 tháng 8, 2016

Tạo Report thống kê trong ứng dụng Web ASP.NET MVC5

Tạo Report thống kê trong ứng dụng Web ASP.NET MVC5

Tạo Report thống kê trong ứng dụng Web ASP.NET MVC5
Mục tiêu
-    Tạo được report đơn giản và nâng cao 
-    Sử dụng thành thạo Control ReportViewer
Hướng dẫn
-    Tạo mới ứng dụng Web ASP.NET MVC5, sử dụng CSDL BookManager như sau:
report asp net mvc
-    Bước 1: Tạo thư mục DataBase, New Item Ado.net Entity Data Model, đặt trong Solution
report
-    Bước 2: Tạo thư mục ReportViewer
report mvc
o    Nhấn chuột phải vào folder ReportViewer, New Item, tạo mới Dataset, đặt tên là DataSet1

report asp net mvc
Nhấn chuột phải vào vùng trống trong DataSet1/ Chọn Add -TableAdapter
report asp net mvc
Bước tiếp chọn tiếp Connection đã tạo ở Bước 1
report asp net mvc5
Build Query string
report asp net mvc
report
Finish
mvc 5
o    Nhấn chuột phải vào thư mục ReportViewer/ Add --> New item --> Chọn report
report mvc
Kéo dữ liệu từ DataSet 1 và thiết kế mẫu Report
report mvc
-    Bước 3: Để sử dụng được Report, bạn sẽ dùng tạm một Web Forms User Control (ascx), để chứa Report
o    Chuột phải vào thư mục Shared của project/ Add --> New Item/ Chọn Web Forms User Control
report asp net mvc
Đặt tên là ReportUserControl
Mở thanh công cụ ToolBox, kéo thả Control ReportViewer và ScriptManager vào giao diện
report
Sau đó xử lý code behind của ReportUserConrol.cs như sau
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public partial class WebUserControl1 : ViewUserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                List<Book> books = null;
                using (BookManagerEntities db = new BookManagerEntities())
                {
                    books = db.Books.OrderBy(s=>s.BookId).ToList();
                    ReportViewer1.LocalReport.DataSources.Clear();
                    ReportDataSource rdc = new ReportDataSource("DataSet1", books);
                    ReportViewer1.LocalReport.DataSources.Add(rdc);
                    double sumLineTotal = (double)db.Books.Sum(od => od.Price);
                    ReportParameter p4 = new ReportParameter("sumprice", sumLineTotal.ToString());
                    ReportViewer1.LocalReport.SetParameters(new ReportParameter[] { p4 });
                    ReportViewer1.LocalReport.Refresh();
                }
            }
        }
    }
-    Bước 4: Tạo Controller với tên là ReportController.cs, viết hàm index
?
1
2
3
4
public ActionResult Index()
        {
            return View();
        }
-    Giao diện trang View Index
?
1
2
3
4
5
6
7
8
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
 
<h2>Thống kê</h2>
 
@Html.Partial("ReportUserControl")
tạo report asp net mvc

Thứ Tư, 3 tháng 8, 2016

Giải pháp SESSION TIMEOUT trong ASP.NET


Giải pháp SESSION TIMEOUT trong ASP.NET


1. SESSION TIMEOUT LÀ GÌ?

Là khoảng thời gian lớn nhất có thể giữa hai lần user request lên server mà session của user chưa bị hủy. Nói một cách đơn giản hơn, giả sử giá trị timeout này là 30′, thì cứ trong 30′, nếu user không gửi một request nào lên server thì session của user đó sẽ không còn hiệu lực.
Trong ASP.NET, session timeout mặc định là 20′. Có nhiều cách để thay đổi giá trị này, đơn giản nhất là thêm một dòng trongweb.config
<sessionState timeout="30"></sessionState>

2. ĐẶT TIMEOUT BAO NHIÊU LÀ HỢP LÝ?

Giá trị mặc định của nó là 20′, tuy nhiên trong một số trường hợp bạn muốn session tồn tại lâu hơn. Ví dụ một ứng dụng web cho phép người dùng soạn thảo nội dung trực tiếp trên trình duyệt. Bạn không muốn session kết thúc trước khi người dùng soạn thảo xong văn bản, vì thế bạn thiết lập timeout bằng một số rất lớn. Điều này không thực sự ổn vì nó sẽ tốn rất nhiều bộ nhớ của server dành cho session của những người dùng không còn trên website của bạn.

3. HEART BEAT PATTERN

Có một giải pháp cho vấn đề này: Thiết lập một giá trị session timeout nhỏ. Đồng thời, phía client sẽ “âm thầm” gửi các request nhỏ, thường xuyên đến server để báo cho server biết nó vẫn còn “sống”. Do đó bạn sẽ không bị tốn bộ nhớ một cách vô ích cho session của những người dùng không còn trên trang. Phương pháp này được biết dưới cái tên Heartbeat design pattern.
Tôi thực hiện điều này trong ASP.NET một cách đơn giản như sau:
Thiết lập một giá trị nhỏ cho session timeout (giả sử là 5′)
<sessionState timeout="5"></sessionState>
Tạo trang KeepAlive.ashx để nhận request thường xuyên từ client. Trang này không cần làm gì cũng được.
Thêm đoạn code javascript sau vào trang bạn muốn thực hiện. Tốt nhất là đặt chúng trong các trang master page
function heartBeat() {
    $.get("KeepAlive.ashx?", function (data) {});
}

$(function () {
    setInterval("heartBeat()", 1000 * 30); // 30s gửi request một lần
});