0

@Html.DropDownListFor を含むビューがあります。フォーム/ビューが読み込まれるときに、モデル プロパティの 1 つに値 (IEnumerable) がある場合、対応するデータを含む一連の div が作成されます。そのプロパティに値がない場合 (別名 Count() == 0)、フォームに単一のボタンを表示することになっています (これにより、そのプロパティのデータが作成されます)。

そのため、ユーザーがドロップダウンからオプションの 1 つを選択すると、現在のフォーム/ビューにデータを入力したのとまったく同じアクション メソッドに対して ajax 呼び出しを実行しますが、今回は id フィールドに値を送信します。

アクションメソッドにブレークポイントがあり、それがヒットしていることを確認しました。正しいパラメーター値があり、ビューに渡されるモデルの正しいデータを作成しますが、モデルがビューを再入力すると、フォーム上のアイテム/コントロールはどれも変更されません。私はcshtmlファイルにブレークポイントを入れても、正しいデータでそこを通り抜けています。

だから、ここに私のコントローラーがあります:

public ActionResult Index(int? id)
        {
            var seasonId = id;

            if (seasonId == null)
            {
                var player = _playerRepository.Query().FirstOrDefault(p => p.PlayerId == _userIdentity.PlayerId);

                if (player.DefaultSeasonId != null)
                    seasonId = (int)player.DefaultSeasonId;
                else
                {
                    return View(new ScheduleModel
                    {
                        Player = player,
                        AvailableSeasons = _seasonRepository.Query().Select(s => s)
                    });
                }
            }

            return View(CreateScheduleModelForSeason((int)seasonId));
        }

これが私の見解の始まりです:

@model LeagueManager.Models.ScheduleModel

@{
    ViewBag.Title = "Schedule(s)";
}

<div class="row">
    @Html.LabelFor(m => m.AvailableSeasons)
    @Html.DropDownListFor(m => m.SelectedSeasonId, new SelectList(Model.AvailableSeasons, "SeasonId", "SeasonName"), new { id = "seasonSelect" })
</div>

<form method="post" action="Schedule/GenerateSchedule">
    <h2>The Season's Schedules/Weeks and Matchups</h2>

    <div>
        <div>
            @if (Model.SchedulesAndMatches == null || (Model.SchedulesAndMatches != null && !Model.SchedulesAndMatches.Any()))
            {
                <input type="submit" class="btn btn-primary" value="Generate Schedule" />
            }
        </div>

そして、ここに ajax 呼び出しがあります:

@* Season Selector *@
$('select#seasonSelect').change(function () {
    var selectedSeasonId = $(this).val();

    $.ajax({
        url: '/Schedule/Index',
        data: { id: selectedSeasonId }
    });
});

繰り返しますが、実際のコードはすべて機能しています。ビューを再レンダリングしていないだけです...

例: id = 1 で ActionResult メソッドを呼び出すと、スケジュール全体が読み込まれます。ドロップダウンを介して id = 2 に切り替えると (その後、ajax を介して再度呼び出されます)、同じスケジュールのままになります。

反対に、id = 2 で ActionResult メソッドを呼び出すと、単一のボタンがロードされます。ドロップダウンから id = 1 に切り替えると、モデルに正しいデータが再入力されますが、ビュー/フォームには新しい情報が反映されません。

助けてください!

4

1 に答える 1