1

私は自分の考え方とプログラミングをWebフォームからMVC3に変換しています。記録のために、それは私の頭を傷つけます。

そのため、月ビューのカレンダーを作成しています(ページにはその月の日とイベントのみが表示されます)。月ごとに移動するために、前と次の2つのボタンを配置しています。Webformsでは、変更はCalendar.aspxでのみ発生します。ただし、2つのActionResults(両方ともHttpPost)を作成する必要があるようです。1つは前のビューに移動し、もう1つは次のビューに移動します。同じ効果を得るためだけに。Index ActionResult / Viewのカレンダーを更新したいと思っていましたが、その方法がわかりません。私のインデックスビューは下にあります。

簡単に言えば、カレンダーを更新してインデックスビューに戻る方法はありますか?または、対応するボタン(前と次)を押したときに新しい月を表示するために、他の2つのビュー(前と次)を作成する必要がありますか?

@model HTMLMVCCalendar.Models.MonthModel

@{
    ViewBag.Title = "Home Page";
    int month = Model.Month;
    int year = Model.Year;
    int numberOfDays = DateTime.DaysInMonth(year, month);
    int startDay = (int)(Convert.ToDateTime(month + "/1/" + year).DayOfWeek);
    int startCount = 1;
}

<h2>@ViewBag.Message</h2>
<p>
    To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
</p>
<div>  
    <table id="calendar">
        <thead>
            <tr>
                <th id="monthHeader" colspan="7">
                    <h3>
                    @{
                        @Convert.ToDateTime(month + "/1/" + year).ToString("MMMM");
                    }
                    </h3>
                </th>
            </tr>
            <tr>
                <th>Sun</th>
                <th>Mon</th>
                <th>Tues</th>
                <th>Wed</th>
                <th>Thur</th>
                <th>Fri</th>
                <th>Sat</th>
            </tr>
        </thead>
        <tbody>
            <tr>
            @for (int i = 0; i < startDay; ++i)
            {
                @:<td><div><span>&nbsp;</span></div><div><span>&nbsp;</span></div></td>
            }
            @for (int j = startDay; j < ((numberOfDays + startDay) + 1); ++j)
            {
                <td>
                    <div><span>@startCount</span></div>
                    <div>
                        <span>
                            @{
                                var todaysEvents = Model.AllDays.ToList().FindAll(d => d.CalDate.Day == startCount);
                                foreach(HTMLMVCCalendar.Models.CalendarModel eventsToday in todaysEvents)
                                {
                                    foreach(HTMLMVCCalendar.Models.EventModel eventToday in eventsToday.CalEvents)
                                    {
                                        <text>
                                            &nbsp;@eventToday.DayCode:<br />
                                            &nbsp;@eventToday.Subject:<br />
                                            &nbsp;@eventToday.EventDesc<br /><br />
                                        </text>
                                    }                                 
                                }
                            }
                        </span>
                    </div>
                </td>
                            if ((j + 1) % 7 == 0)
                            {
                    @:</tr><tr>
                }
                ++startCount;
            }
            </tr>
        </tbody>
    </table>
    <div>
        <input id="previous" type="submit" value="submit" />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        <input id="next" type="submit" value="submit" />
    </div> 
</div>

更新: 私はこれを試しましたが、うまくいくはずだと思います。なぜそうしなかったのか分かりませんか?

    <div>
        @using (Html.BeginForm("Previous", "Home"))
        {
            <input id="previous" type="submit" value="Previous" />
        }
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        @using (Html.BeginForm("Next", "Home"))
        {
            <input id="next" type="submit" value="Next" />
        }
    </div> 


public ActionResult Index()
{
    ViewBag.Message = "Welcome to ASP.NET MVC!";

    int month;
    int year;

    int.TryParse(ViewBag.Year, out year);
    int.TryParse(ViewBag.Month, out month);
    Calendar monthEventsCal = new Calendar();

    HTMLMVCCalendar.Models.MonthModel allMonthEvents = monthEventsCal.monthEvents(year, month);
    return View("Index", allMonthEvents);            
}

[HttpPost]
public ActionResult Previous(HTMLMVCCalendar.Models.MonthModel prevMonth)
{
    Calendar monthEventsCal = new Calendar();
    var newMonth = monthEventsCal.previousMonth(prevMonth.Year, prevMonth.Month);

    ViewBag.Month = newMonth.Item2;
    ViewBag.Year = newMonth.Item1;
    return RedirectToAction("Index");
}

[HttpPost]
public ActionResult Next(HTMLMVCCalendar.Models.MonthModel nextMonth)
{
    Calendar monthEventsCal = new Calendar();
    var newMonth = monthEventsCal.nextMonth(nextMonth.Year, nextMonth.Month);

    ViewBag.Month = newMonth.Item2;
    ViewBag.Year = newMonth.Item1;
    return RedirectToAction("Index");
}
4

2 に答える 2

1

それを行うための提案された潜在的な方法

public virtual ActionResult Index(int? month)
{
    int relativeMonth = 0;
    if(month.HasValue)
        relativeMonth = month.Value;

    //Create ViewModel fetching calender data using relativeMonth value.
    //For example if relativeMonth is 0 fetch current month view model.
    //If relative month is -3 fetch calendar data from three months ago.

    if(Request..IsAjaxRequest()) //Optional. If you want ajax.
        return PartialView("Calendar", model);

    return View(model);
}

このメソッドを使用すると、次のボタンと前のボタンがリンクになり、前のボタンは relativeMonth - 1 にリンクし、次のボタンは relativeMonth + 1 になります。実際にはフォーム データを送信していないため (これを使用して)、それらを投稿する必要はないと思います。ボタンのようなスタイルの次と前のリンクを作成する方法)。

ajax を有効にしたい場合は、カレンダー ビューを別の cshtml に貼り付けて、index.cshtml で部分ビューとして呼び出します。

于 2012-04-12T17:07:49.493 に答える
0

これを行うにはいくつかの方法があります。最も簡単な方法は、ajax 呼び出しを行い、返されたデータでビューを更新することです http://bob-the-janitor.blogspot.com/2010/12/easy-ajax-with- aspnet-mvc-and-jquery.html ファンシーにしたい場合は、ここに示すように、ajax 呼び出しからビューを返し、現在のビューを置き換えることもできます http://bob-the-janitor.blogspot.com/2011/11 /more-ajax-with-mvc-using-partial-views.html

于 2012-04-12T15:45:13.160 に答える