Должен ли я передавать значения через RedirectToAction или TempData?

Я видел некоторые статьи (даже MSDN), предлагающие TempData для передачи данных между ActionMethods. Но я видел, как другие здесь говорят, что следует избегать TempData. Каков наилучший способ приблизиться к этому?

Вот некоторый код, чтобы показать мою ситуацию. Примечание: я на 100% уверен, что делаю это неправильно. Вот почему я здесь. :) Кроме того, до недавнего времени я занимался веб-формами.

Примечание 2: Это связано, но не одно и то же. < /а>

Вид:

<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 });
}

person dotnetN00b    schedule 17.04.2012    source источник
comment
Определите тип данных, которыми вам нужно делиться (и как), и мы можем предложить лучшую альтернативу, чем TempData, который ненадежен как хороший механизм передачи данных.   -  person Tejs    schedule 17.04.2012
comment
Индекс загружает календарь со своими событиями. Кнопки «Предыдущий» и «Следующий» должны отправлять месяц и год (например, 4 и 2012) в методы действий «Предыдущий» и «Следующий». Они, в свою очередь, вычисляют нужный месяц и год и передают их методу действия Index.   -  person dotnetN00b    schedule 17.04.2012
comment
Пожалуйста, посмотрите на это, это может вам помочь, stackoverflow.com/questions/ 7993263/   -  person Hari Gillala    schedule 17.04.2012


Ответы (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-адресе и представляете то же представление, но с нужными вам изменениями. Вам не нужна конкретная конечная точка для каждого действия.

person Tejs    schedule 17.04.2012

Я придумал это. Это плохо, хорошо, нужно улучшить?

БРИТВА/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 });
        }

Глобальный.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
            );

        }
person dotnetN00b    schedule 17.04.2012