2

私は Entity Framework で MVC4 を使用しています。多くの人と同じように、MVC を初めて使用し、デザイン パターンを理解しようとしています。

認証されたメンバーがセッションに予約できるようにするアクションリンクが続くセッションのリストを表示する部分的なビューがあります。

注: わかりやすくするために、コードの大部分を省略しています。メンバーがセッションに予約されている場合、アクション リンクの代わりに「予約済み」と表示されます。

@using OnlineBookings.Website.Models
@{ DateTime currentDate = DateTime.MinValue.Date; }

<form method="post" action="~/Controllers/BookSessionController.cs">
@foreach (SessionsWithBookingInformation s in Model)
{
  <p>@s.StartTime.ToString("t") 
            @s.Description 
            @Html.ActionLink(
                            "Book", 
                            "BookSession", 
                            new { sessionId = s.SessionId } 
                            ) 
   </p>
}    
</form>

これは、より大きなビューの一部として表示されます。

ここに画像の説明を入力

actionlinks は、予約するセッションの GUID をコントローラーの次の関数に渡します。この関数は、Cookie から memberId を取得し、Entity Framework を使用してそのメンバーとセッションの予約を作成します。

public ActionResult BookSession(Guid sessionId)
{
    using (var db = new OnlineBookingsEntities())
    {
        // see if the member id is stored in a cookie
        if (Request.Cookies["memberId"] != null)
        {
            var memberId = new Guid(Request.Cookies["memberId"].Value);
            db.Bookings.Add(new Booking
            {
                BookingId = Guid.NewGuid(),
                MemberId = memberId,
                SessionId = sessionId,
                BookingTime = DateTime.Now
            });
            db.SaveChanges();
        }
    }

    // this refreshes the entire page
    /// is there a better way to just replace the actionlink they clicked on?
    return RedirectToAction("Index", "Home");   
}

これらはすべてうまく機能しており、予約は効果的に記録されています。

しかし、私が理解しようとしているのは、BookSession関数からの戻り値が actionlink テキストを更新できるかどうかです。

理想的には、成功時には部分ビューの ActionLink を「予約済み」という単語に置き換え、失敗時には「セッションがいっぱい」などの失敗状態に置き換えたいと考えています。

または、部分ビューを更新することもできます。これは、同じことを行うためです。

ここで簡単なものが欠けていますか?または、私は完全に間違ったツリーを吠えていますか?

4

1 に答える 1

3

あなたの質問は素晴らしく、非常によく説明されていますが、「どうすればいいですか?」質問。ソリューションの開発に役立ついくつかのオプションを次に示します。

  1. 同じビューを再表示します。ユーザーがリンクを送信するために使用していたビューを返します。これは単純な更新のように見えます。

    return View();
    
  2. AJAX 経由でリクエストを送信し、部分ビュー経由で更新します。個々の予約の詳細を内部idに含む、または同様の HTML 要素にタグを付けます。spanおそらく 経由で AJAX を使用してリクエストを送信し、@Ajax.ActionLinkアクションで部分ビューを返すようにします。

    return PartialView("_OnlineBookingPartial", model);
    

    部分ビューが返されたら、返されたデータで特定の予約を更新します。

  3. 再び AJAX を使用しますが、JSON を返します。もう 1 つの方法は、AJAX を再度使用することですが、代わりに JSON を返して何かを行うことです。たとえば、置き換えるテキストを返すことができますBook。つまり、「Session full」または「Booked!」です。

    return new JsonResult
        {
            Data = "Booked!"
        }
    

個人的には、おそらく AJAX を使用して、非 AJAX (非 Javascript) フォールバックで更新します。

@Ajax.ActionLinkこれを行うには、リクエストが AJAX であるか、コントローラー アクション内にないかを使用して確認します。

if (Request.IsAjaxRequest) {
    return PartialView("_OnlineBookingPartial", model);
}

return View();

これは、ブラウザーで Javascript が有効になっており、AJAX をサポートしている場合、それが使用され、プロセス全体がユーザーにとってシームレスで瞬時になることを意味します。Javascript が無効になっている場合、ページは単に更新されます。

于 2013-05-29T23:05:38.137 に答える