2016-10-11 7 views
0

ユーザーが詳細を入力するフォームがあります。私はここにCouponsControllerリダイレクトユーザーがフォームを送信した後、ビューに<Data>を表示します。

の作成方法
 [HttpPost] 
    public ActionResult Create(CouponViewModel viewModel) 
    { 
     if (!ModelState.IsValid) 
     { 
      var model = new CouponViewModel 
      { 
       Students = _context.Students.ToList() 
      }; 
      return View("Index", model); 
     } 

     for (int i = 1; i <= viewModel.NumberOfCoupons; i++) 
     { 
      var coupon = new Coupon 
      { 
       CouponNumber = viewModel.CouponNumber, 
       ValidationCode = viewModel.ValidationCode(6), 
       Price = viewModel.Price, 
       StudentId = viewModel.Student, 
       DateTime = Convert.ToDateTime(DateTime.Now.ToString("yy-MMM-dd ddd")) 
      }; 

      _context.Coupons.Add(coupon); 

      _context.SaveChanges(); 

     } 

     var coupons = _context.Coupons 
      .Where(c => c.StudentId == viewModel.Student) 
      .Include(s => s.Student) 
      .ToList(); 

     TempData["viewModel"] = coupons; 
     return RedirectToAction("GetCoupons"); 
    } 

を視野に、私は私のようなのためにstuckedされているビュー

 [HttpPost] 
    public ActionResult GetCoupons() 
    { 
     Coupon coupon = TempData["viewModel"] as Coupon; 

     return View("Print", (IEnumerable<Coupon>)coupon); 
    } 

に表示するTempDataをを受け取るビューがあるリダイレクト

   @using (Html.BeginForm("Create","Coupons")) 
      { 
       <div class="row"> 
        <div class="col-sm-8"> 
         <div class="page-header">Generer Coupon</div> 
        </div> 
       </div> 
       <div class="row"> 
        <div class="col-sm-4"> 
         @Html.AntiForgeryToken() 
         <div class="form-group"> 
          @Html.LabelFor(m => m.Student) 
          @Html.DropDownListFor(m => m.Student, new SelectList(Model.Students, "Id", "Name"), "", new { @class = "form-control input-lg" }) 

         </div> 
        </div> 
       </div> 
       <div class="row"> 
        <div class="col-sm-4"> 
         @Html.AntiForgeryToken() 
         <div class="form-group"> 
          @Html.LabelFor(m => m.Price) 
          @Html.TextBoxFor(m => m.Price, new { @class = "form-control input-lg" }) 
         </div> 
        </div> 
       </div> 
       <div class="row"> 
        <div class="col-sm-4"> 
         @Html.AntiForgeryToken() 
         <div class="form-group"> 
          @Html.LabelFor(m => m.NumberOfCoupons) 
          @Html.TextBoxFor(m => m.NumberOfCoupons, new {@class = "form-control input-lg"}) 
         </div> 
        </div> 
       </div> 
       <div class="row"> 
        <div class="col-sm-4"> 
         <button class="btn btn-success btn-lg">Generer</button> 
        </div> 
       </div> 
      } 

3日。私はどこが間違っているのか分かりません

+1

正確に何をしていますか? 'GetCoupons()'は '[HttpGet]'でなければなりません。あなたはidだけを渡し、リダイレクトされたアクションでルックアップを行うことを検討するかもしれません。あなたはそのように 'TempData'を避けることができます。コレクションを単一の 'Coupon'にキャストしています。 – Jasen

+0

"コレクションを単一のクーポンにキャストしています" ...キャストしないようにしましたが、その方法はわかりません。 IDを渡す方法? –

+0

私はプロジェクトを実行すると、 "リソース/クーポン/ Getcouponsが見つかりません"と表示されます –

答えて

1

あなたの例にはいくつか問題があります。しかし、あなたが何か別のことをすれば、それらを排除することができます。

[HttpPost] 
public ActionResult Create(CouponViewModel viewModel) 
{ 
    return RedirectToAction("GetCoupons", new { studentId = viewModel.Student }); 
} 

最初に、リダイレクトされたアクションには[HttpGet]とマークする必要があります。クエリ文字列にIDを渡して、リダイレクトされたアクションでルックアップを実行すると、TempDataを回避することもできます。

[HttpGet] 
public ActionResult GetCoupons(int studentId) 
{ 
    var coupons = _context.Coupons 
     .Where(c => c.StudentId == studentId) 
     .Include(s => s.Student) 
     .ToList(); 

    return View("Print", coupons); 
} 

TempDataは間違っていませんが、リフレッシュ時には保持されません。時にはそれを役に立つような機密データを渡すこともあります。単一のCouponへのキャストはあなたが望むものではありません。代わりにコレクションにキャストしてください。

[HttpGet] 
public ActionResult GetCoupons() 
{ 
    var coupons = TempData["viewModel"] as IEnumerable<Coupon>; 
    return View("Print", coupons); 
} 
+0

ありがとうJasen。私は変更を加え、それは完全に動作します –

関連する問題