7

私は友人のヘアサロンのための小さなMVCウェブサイトを持っています。このページには、データベースレコードから取得した数値を表示するために使用されるdivがあります。この数は、ヘアカットを待っているキューに座っている現在の人数です。

私が現在持っているのは、「管理者」ページにログオンし、フォームを使用してこの番号を「2」から「5」に更新し、座っている人数に応じて「5」を「6」に変更する機能です。このキュー。

これは、現在のところ手動操作です。コードは以下のとおりです。

=============================

コントローラ

[HttpPost]
        public ActionResult Update(Data data)
        {
            if (ModelState.IsValid)
            {
                data.ID = 1; //EF need to know which row to update in the database. 
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index", "Home");
            }

            return View(data);
        }

====================================

モデルコード

{
    public class Data
    {
        public int ID { get; set; }
        public string Queue_Number { get; set; }
    }

    public class DataDBContext : DbContext
    {
        public DbSet<Data>Queue { get; set; }
    }
}

私が本当にやりたいのは、「管理者」ページのフォームからキュー番号を手動で更新したら、20分(ヘアカットにかかるおおよその時間)の自動カウントダウンが必要なことです。キュー番号は、「0」になるまで1ずつ自動調整されます。

たとえば、キュ​​ーに5人いる場合、20分後に4人に自動調整され、Webページが自動更新/更新されます。さらに2人が入ってくるので、手動でキューに6人に調整すると、タイマーが開始します。この場合も、20分が経過するたびに、キューが「0」になるまで-1ずつ調整されます。「0」に達すると、手動でキューに人を追加するまでそこにとどまります。

どうすればそのようなリクエストから始められるのか、それが可能だとしても、私にはわからないのではないかと思います。

私のためにそれを「ベビーステップ」することができるかもしれないここの専門家からのどんな助けにも本当に感謝するでしょう。私が提供していない情報は追加するように努めます-私は自分自身を説明するのが得意ではないことに気づきます:-(

4

4 に答える 4

7

Ajax について考えたことはありますか?フラグを手動で設定して、最終更新時刻を保存していますか? jquery Set intervalを使用して同時に実行するAjaxリクエストを使用できます。これにより、2分ごとにajaxリクエストがトリガーされます。最後に更新された時刻を確認し、それが 20 分経過した場合は、データベースから 1 つを削除します。返された値が新しい番号になり、jquery がその番号を更新できます。

実際には非常に単純なプロセスですが、基になるデータの詳細が必要です。

これがあなたの質問からどのように機能するかを確認する方法です

コントローラー内

public ActionResult ajaxUpdate()
        {
            //open connection
            dbcontext db = new dbcontext();
            db.Connection.Open();

            // get the last updated record in the database.
            var entry = db.Entry.OrderByDecending(m=> m.LastUpdatedDate).FirstOrDefault();

            //clean up
            db.Connection.Close();
            db.Dispose();

            //return -1 as error
            if(entry == null){

                return Json(-1,JsonRequestBehavior.AllowGet);

            }

            // get current number of people in queue
            Int32 numberOfPeople = entry.QueueNumber;

            TimeSpan span = DateTime.Now.Subtract(entry.LastUpdatedDate);

            if(span.Minutes >= 20){

                // if 20 mins have passed assume a person has been completed since manual update
                numberOfPeople--;

            }

            //this returns a number, alternatively you can return a Partial
            return Json(numberOfPeople, JsonRequestBehavior.AllowGet);
        }

Jquery と Ajax

$(document).ready(function () {

    // run function every x minutes
    setInterval(function () {
        UpdateQueue();
    }, 100000);





});
    function UpdateQueue() {

    $.ajax({
        cache: true,
        type: 'POST',
        url: "/ControllerName/ajaxUpdate",
        async: false,
        dataType: "json",
        success: function (result) {
            // on success result will be the number returned

            // -1 is error
            if (result == -1) {
                return;

            }

            // check the -- didn't return a negative
            if (result < 0) {

                result = 0;

            }

            //find your element in the HTML to update
            $('#NumberElement').text().replaceWith(result);


        }

    });


}

このコードを含める前に、jquery ライブラリを含める必要があります。そうしないと、Jquery が定義されません。

于 2012-11-30T12:16:32.070 に答える
4

少しスレッド化してサーバー側のソリューションを補いました。クリティカル セクションのロックについて、私が正しいことを願っています。

アプリケーションの管理者が現在の顧客の数を減らすためにページにハングアップする必要がないという利点があります (彼は ajax リクエストの場合のように)。

使い方

「顧客数」の更新では、(必要に応じて) 新しいカウントダウン スレッドが開始されます。このスレッドは、事前に定義された間隔で待機 (スリープ) し、数を減らします。

public class CustomerAdminService
{
    // time in milliseconds it will take to decrease number of waiting customers 
    const int sleepTime = 10000;
    // current number of customers (just for simplicity - you can have it in db or somewhere else)
    static int numberOfCustomers;

    static Thread updaterThread;

    // object lock
    static readonly object locker = new Object();

    public int GetNumberOfCustomers()
    {
        return numberOfCustomers;
    }

    public void UpdateCustomers(int value)
    {
        lock (locker)
        {
            if (updaterThread == null)
            {
                //start new downcounting thread
                updaterThread = new Thread(new ThreadStart(UpdateWorker));
                updaterThread.Start();
            }
            SetNumberOfWaitingCustomers(value);
        }
    }

    private void SetNumberOfWaitingCustomers(int value)
    {
        numberOfCustomers = value;
    }

    // downcounting thread method
    private void UpdateWorker()
    {      
        while (true)
        {
            // sleep for predefined time
            Thread.Sleep(sleepTime);
            lock (locker)
            {              
                var number = GetNumberOfCustomers();             
                if (number <= 1)
                {
                    // if number of currents customers is now zero - end the downcounting thread
                    SetNumberOfWaitingCustomers(0);
                    updaterThread = null;
                    return;
                }
                SetNumberOfWaitingCustomers(number - 1);
            }
        }
    }
}

コメント: タイマー ダウンカウント スクリプトに jQuery を使用することを検討できます。次のような表示: 40 分で提供できます ;-)

于 2012-12-06T23:55:14.730 に答える
1

はい、Ajaxが鍵です。あなたのウェブサイトがサーバーと気付かずに通信するために使用できます.

于 2012-12-10T08:27:58.287 に答える
1

別のアプローチとして、データベース内のカウントを更新せず、クエリを使用して特定の期間内の顧客数を特定する方法があります。QueueNumberこれを行うには、代わりに到着時間を使用するようにモデルを変更し、新しいデータ レコードを挿入するようにコントローラーを変更します。

{
    public class Data
    {
        public int ID { get; set; }
        public DateTime Arrival_Time { get; set; }
    }

    public class DataDBContext : DbContext
    {
        public DbSet<Data> Queue { get; set; }
    } 
}

このように、他の人が示唆しているように、AJAX を使用して、次のようなコントローラー アクションでキュー内の人数をポーリングできます。

[HttpGet]
public ActionResult NumberOfPeopleInQueue()
{
    var result = db.NumberOfCustomersSince(DateTime.Now.AddMinutes(-20));
    return Json(result);
}

このアプローチの優れた点は、ヘアカットに時間がかかり始めた場合 (たとえば 30 分)、クエリを変更するだけで、アプリケーションが引き続き機能することです。

于 2012-12-10T08:59:54.433 に答える