2

モデル内の項目数に基づいてハイパーリンクを作成する foreach ループがあります。ProgramId = @item.ProgramIds.First()各 ProgramType の最初のプログラム ID のみを返すという部分を除いて、正常に動作しています。最初のプログラム ID だけでなく、すべてのプログラム ID をループさせるための構文は何ですか?

@model IEnumerable<CMESurvey.ViewModels.ProgramTypeViewModel>
@{
    ViewBag.Title = "Home";
}
@foreach (var item in Model)
{ 
    <h2>@Html.DisplayFor(modelItem => item.ProgramTypes)</h2> 

    <ul>
        @foreach (var ProgramTitles in item.ProgramTitles)
        {
            <li>

                @Html.ActionLink(@ProgramTitles, "Results", "SurveyResponse", new { ProgramId = @item.ProgramIds.First() }, null)
    </li>
    }
</ul>

}

   public class ProgramTypeViewModel
    {
        public int ProgramTypeIds { get; set; }

        public IEnumerable<string> ProgramTitles { get; set; }

        public IEnumerable<int> ProgramIds { get; set; }

        public IEnumerable<string> ProgramTypes { get; set; }

    } 

コントローラーのアクション:

 public ViewResult Home()
        {
            var data = from SurveyProgramModel in surveyProgramRepository.Get()
                       group SurveyProgramModel by SurveyProgramModel.ProgramTypeId into programTypeGroup
           select new ProgramTypeViewModel()
           {

               ProgramTypeIds = programTypeGroup.Key,
               ProgramIds = programTypeGroup.Select(r => r.ProgramId),
               ProgramTitles = programTypeGroup.Select(r => r.ProgramTitle),
               ProgramTypes = programTypeGroup.Select(r => r.ProgramType.ProgramType).Distinct(),
           };

            return View(data);
        }
4

2 に答える 2

3

item外側のループからの値を参照します。内側のループの値を使用したいようです:

@foreach (var ProgramTitles in item.ProgramTitles)         
{             
    foreach(var programId in item.ProgramIds)
    {

       <li>                  
           @Html.ActionLink(ProgramTitles, "Results", "SurveyResponse", new { ProgramId = programId  }, null)             
       </li>         
    }
} 

viewModel を指定すると、ProgramTitles と ProgramIds が 2 つの切断された配列になっているように見えます。おそらく、ProgramTitle の配列インデックス n の項目には、ProgramIds 配列の n 番目の項目に対応するエントリがあります。viewModel は改善できますが、これが私の解決策です。

@for (var index = 0; index < item.ProgramTitles.Count; index++)         
{             

       <li>                  
           @Html.ActionLink(ProgramTitles[index], "Results", "SurveyResponse", new {  ProgramId = item.ProgramIds[index]}, null)             
       </li>         
}
于 2012-07-05T16:17:17.730 に答える
1

モデルとクエリに少し混乱しています。私が理解できる限り、プログラムと型の間には関係があるはずですが、関係はありません。

したがって、ビューモデルとそのクエリを確認することを強くお勧めします。

ただし、これが役立つかどうかを確認してください。

@foreach (var currentProgramTypeViewModel in Model)
        { 
            foreach(string currentProgramType in currentProgramTypeViewModel.ProgramTypes)
            {
                <h2>@currentProgramType</h2> 

                <ul>
                    @for (int mProgramIndex = 0; mProgramIndex < currentProgramTypeViewModel.ProgramIds.Count(); mProgramIndex++)
                    {
                        var programTitle = currentProgramTypeViewModel.ProgramTitles.ToList<string>()[mProgramIndex];
                        var programId = currentProgramTypeViewModel.ProgramIds.ToList<int>()[mProgramIndex];
                        <li>
                            @Html.ActionLink(programTitle, "Results", "SurveyResponse", new { ProgramId = programId }, null)
                        </li>
                    }
                </ul>
            }
        }
于 2012-07-05T18:19:11.360 に答える