1

に次のコードがHomeControllerあります。最新の日付を取得し、その日付に従って曲を表示します。

public ActionResult Index()
{           
   var topsong = db.TopSongs;
   var topDate = db.TopDates;
   var latestDate = topDate.OrderByDescending(d => d.Date).FirstOrDefault();
   int dateId = topDate.OrderByDescending(d => d.DateId).FirstOrDefault().DateId;
   var topTitles = topsong.Where(s => s.DateId == latestDate.DateId).ToList();

   ViewBag.Message = "Top Songs";                                    
   ViewBag.latestDate = latestDate.Date.ToShortDateString();            

   return View(topTitles);
}

これはデータベースに入り、最新の日付 (2012 年 8 月 25 日としましょう) を選択し、この日付に対応するすべての曲を表示します。この部分は正常に機能しています。今、ユーザーがデータベースから前の日付または次の日付を選択し、それに応じて曲を表示できる機能を追加したいと考えています。

私がやろうとしているのは、ビューに前の日付と次の日付のボタンを追加することです。このような:

<h2>Songs Updated On: @ViewBag.latestDate</h2>
@Html.ActionLink("Previous Week's Songs", "Index", new { });
@Html.ActionLink("Next Week's Songs", "Index", new { });

私は MVC3 を初めて使用するので、前の日付と次の日付を表示する方法を教えてください。ビューでそれらを計算する場合、それらの日付の曲を表示するためにそれらをコントローラーに戻すにはどうすればよいですか?

日付テーブルの例を次に示します。 DateId Date 1 08/25/2012 2 08/20/2012 3 09/21/2012

更新されたコード:

HomeController のコードは次のとおりです。

 public ActionResult Index(DateTime? date = null)
        {            
            var topsong = db.TopSongs;
            var topDate = db.TopDates;

            var latestDate = (date.HasValue) ? date.Value : topDate.OrderByDescending(d => d.Date).FirstOrDefault();           


            //var latestDate = topDate.OrderByDescending(d => d.Date).FirstOrDefault();

            int dateId = topDate.OrderByDescending(d => d.DateId).FirstOrDefault().DateId;           
            var topTitles = topsong.Where(s => s.DateId == latestDate.DateId).ToList();

            /////
            ViewBag.NextDate = topDate.Where(d => d.Date > latestDate).OrderBy(d => d.Date).FirstOrDefault();
            ViewBag.PreviousDate = topDate.Where(d => d.Date < latestDate).OrderByDescending(d => d.Date).FirstOrDefault();
            ////////

            ViewBag.Dates = topDate.Select(d => d.Date).Distinct();
            ViewBag.latestDate = latestDate.Date.ToShortDateString();            

            return View(topTitles);
        }

Index.cshtml のコード

@model IEnumerable<App.Models.TopSong>
@{
    ViewBag.Title = "Top Songs";
    var songs = ViewBag.songs;
}            
<h1>@ViewBag.Message</h1>

<h2>Song's Updated On: @ViewBag.latestDate</h2>
@Html.ActionLink("Previous Week's Songs", "Index", new { date=@ViewBag.PreviousDate });
@Html.ActionLink("Next Week's Songs", "Index", new { date=@ViewBag.NextDate });

基本的に、アクションリンクを使用して前または次の日付に移動できるようにしたいだけです。上記のコードを試しましたが、うまくいきません。

4

2 に答える 2

1

これを行う 1 つの方法は次のとおりです。

まず、アクションメソッドを作成します

Public ActionResult Songs(string val)
{
   if (val == "Previous")
   {
    // code to get and return previous week songs
   }

   if (val == "Next")
   {
    // code to get and return next week songs
   }

    // By default return either previous/next/current week's songs...
}

次に、以下のように一致するようにアクション リンクを変更します。

@Html.ActionLink("Previous Week's songs", "Songs", new { val = "Previous"})

@Html.ActionLink("Next Week's Songs", "Songs", new { val = "Next"})

別のアプローチ:

もう 1 つの方法は、それぞれに対してアクション メソッドを作成することです。つまり、前の週の曲だけを返すアクション メソッドと、次の週の曲を返す別のアクション メソッドを持つことができます。これは、引数を渡す必要がなく、actionlink コードが以下のようにシンプルに見えることを意味します。

   @Html.ActionLink("Previous Week's songs", "PreviousWeekSongs")

   @Html.ActionLink("Next Week's Songs", "NextWeekSongs")

アップデート:

モデルデータをビューにバインドするためのコードがないようです...そのため、以下のようにビューコードを更新してみてください

    @model IEnumerable<App.Models.TopSong>
@{
    ViewBag.Title = "Top Songs";
    var songs = ViewBag.songs;
}            
<h1>@ViewBag.Message</h1>
// Code to Display Songs
@foreach(var song in model)
{
  <div> 
   <span>@song.Property1</span>
   <span>@song.Property2</span>
   <span>@song.Property3</span>          
  </div>

}

<h2>Song's Updated On: @ViewBag.latestDate</h2>
@Html.ActionLink("Previous Week's Songs", "Index", new { date=@ViewBag.PreviousDate });
@Html.ActionLink("Next Week's Songs", "Index", new { date=@ViewBag.NextDate });

これがお役に立てば幸いです...

于 2012-08-27T15:48:00.197 に答える
1

最初の質問に対する答えは、View Modelを作成することです。ここでの考え方は、ビューに必要なすべてのデータを提供することです。例えば:

public class ViewModel
{
    public string CurrentDate { get; set; }
    public DateTime NextDate { get; set; }
    public DateTime PreviousDate { get; set; }
    public List<Song> Songs { get; set; }
}

したがって、必要に応じてこれを入力します。

var topDate = db.TopDates;
var model = new ViewModel();
model.Songs = ...
model.CurrentDate = latestDate.Date.ToShortDateString();
model.NextDate = topDate.Where(d => d.Date > latestDate).OrderBy(d => d.Date).FirstOrDefault(d => d.Date);
model.PreviousDate = topDate.Where(d => d.Date < latestDate).OrderByDescending(d => d.Date).FirstOrDefault(d => d.Date);

モデルの値を使用して、Razor ビューでリンクを作成できるようになりました。

@Html.ActionLink("Previous Week's Songs", "Index", new { date=Model.PreviousDate });
@Html.ActionLink("Next Week's Songs", "Index", new { date=Model.NextDate });

最後に、ポストバックでリンクを処理するには、上記で指定したルート値に一致するパラメーターを Action メソッドに追加します ( date)。

public ActionResult Index(int? date = null)
{
    var latestDate = (date.HasValue) ? date.Value : db.TopDates.OrderByDescending(d => d.Date).FirstOrDefault(d => d.Date);
    // same logic
}
于 2012-08-27T00:11:16.600 に答える