2012-04-17 8 views
3

私はいくつかの記事(MSDNでも)が、ActionMethods間でデータを渡すためのTempDataを提案しているのを見ました。しかし、ここでは、TempDataを避けなければならないと言っている人もいます。これにアプローチするベストプラクティスの方法は何ですか?RedirectToActionまたはTempDataを通じて値を渡すべきですか?

ここに私の状況を示すいくつかのコードがあります。 注:私は100%確信しています、私はこれを間違っています。それが私がここにいる理由です。 :)また、私は最近までWebformsをやってきました。

注2:This is related, but not the same.

ビュー:

<div> 
    @using (Html.BeginForm("Previous", "Home", new {month = @month}, FormMethod.Post)) 
    { 
     <input id="previous" type="submit" value="Previous" /> 
    } 

    // This fails but that's another situation 
    @using (Html.BeginForm("Next", "Home", new {month = @month, year = @year}, FormMethod.Post)) 
    { 
     <input id="next" type="submit" value="Next" /> 
    } 
</div> 

コントローラのメソッド:

[HttpPost] 
public ActionResult Previous(HTMLMVCCalendar.Models.MonthModel prevMonth) 
{ 
    Calendar monthEventsCal = new Calendar(); 

    int month = prevMonth.Month; 
    int year = prevMonth.Year; 

    var newMonth = monthEventsCal.previousMonth(year, month); 

    month = newMonth.Item2; 
    year = newMonth.Item1; 

    return RedirectToAction("Index", "Home", new { month = month }); 
} 

[HttpPost] 
public ActionResult Next(HTMLMVCCalendar.Models.MonthModel nextMonth) 
{ 
    Calendar monthEventsCal = new Calendar(); 

    int month = nextMonth.Month; 
    int year = nextMonth.Year; 

    var newMonth = monthEventsCal.nextMonth(year, month); 

    month = newMonth.Item2; 
    year = newMonth.Item1; 

    return RedirectToAction("Index", "Home", new { year = year, month = month }); 
} 
+0

あなたが共有する必要があるデータの種類を定義します(とどのように)、我々は、良いデータ転送メカニズムとして信頼性が低い、「TempData」よりも優れた選択肢を提案することができます。 – Tejs

+0

インデックスはカレンダーをイベントとともにロードします。 [前へ]ボタンと[次へ]ボタンは、前と次のアクションメソッドに月と年(例:4と2012)を送信する必要があります。彼らは必要な年月を計算し、それをIndexのアクションメソッドに渡します。 – dotnetN00b

+1

これを見てください、それはあなたを助けるかもしれません、http://stackoverflow.com/questions/7993263/viewbag-viewdata-and-tempdata –

答えて

2

あなたもしっかりとあなたの最終的な結果にあなたのアクションメソッドをカップリングされているように聞こえます。

少しリファクタリングします。あなたはそのようなあなたのインデックス法を持っているでしょう:

public ActionResult Index() 
{ 
     HTMLMVCCalendar.Models.MonthModel someModel = new HTMLMVCCalendar.Models.MonthModel(); 

     someModel.DateTime = DateTime.Now; // whatever 

     return View(someModel); 
} 

次に、あなたがあなたのカレンダーを再計算する必要がある場合、あなたは単に新しいビューモデルデータと同じビューを返します。同じURLを投稿してください。

[HttpPost] 
public ActionResult Index(HTMLMVCCalendar.Models.MonthModel previousModel, bool? goForward) 
{ 
     if(goForward.HasValue && goForward.Value) 
      previousModel.DateTime = previousModel.DateTime.AddMonths(1); 
     else 
      previousModel.DateTime = previousModel.DateTime.AddMonths(-1); 

     return View(previousModel); 
} 

同じURLにとどまり、同じビューを表示しますが、必要な変更があります。あなたは、各アクションに特定のエンドポイントが必要ない。

0

私はこれを思いついた。これは良い、良い、改善する必要がありますか?

RAZOR/HTML:

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

コントローラ/アクションメソッド:

public ActionResult Index(int? year = 2012 , int? month = 2) 
     { 
      ViewBag.Message = "Welcome to ASP.NET MVC!"; 

      Calendar monthEventsCal = new Calendar(); 

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

     [HttpPost] 
     public ActionResult Previous(int? year = 2012, int? month = 2) 
     { 
      Calendar monthEventsCal = new Calendar(); 

      var newMonth = monthEventsCal.previousMonth(year.Value, month.Value); 

      int currMonth = newMonth.Item2; 
      int currYear = newMonth.Item1; 

      return RedirectToAction("Index", "Home", new { month = currMonth, year = currYear }); 
     } 

     [HttpPost] 
     public ActionResult Next(int? year = 2012, int? month = 2) 
     { 
      Calendar monthEventsCal = new Calendar(); 

      var newMonth = monthEventsCal.nextMonth(year.Value, month.Value); 

      int currMonth = newMonth.Item2; 
      int currYear = newMonth.Item1; 

      return RedirectToAction("Index", "Home", new { month = currMonth, year = currYear }); 
     } 

Global.asax.cs:

public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      routes.MapRoute(
       "Default", // Route name 
       "{controller}/{action}/{month}/{year}", // URL with parameters 
       new { controller = "Home", action = "Index", month = UrlParameter.Optional, year = UrlParameter.Optional } // Parameter defaults 
       //"{controller}/{action}/{id}", // URL with parameters 
       //new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
      ); 

     } 
関連する問題