redirectToAction приводит к нулевой модели - PullRequest
5 голосов
/ 26 марта 2010

У меня есть 2 действия на контроллере:

public class CalculatorsController : Controller
{
    //
    // GET: /Calculators/

    public ActionResult Index()
    {
        return RedirectToAction("Accounting");
    }


    public ActionResult Accounting()
    {
        var combatants = Models.Persistence.InMemoryCombatantPersistence.GetCombatants();
        Debug.Assert(combatants != null);
        var bvm = new BalanceViewModel(combatants);
        Debug.Assert(bvm!=null);
        Debug.Assert(bvm.Combatants != null);
        return View(bvm);
    }

}

Когда вызывается метод Index, я получаю нулевую модель. Когда метод учета вызывается напрямую через его URL, я получаю гидратированную модель.

Ответы [ 2 ]

1 голос
/ 27 марта 2010

Ваш вид для учета операций ожидает модель. (BalanceViewModel). У метода действия индекса нет экземпляра BalanceViewModel.

Существует несколько способов решить эту проблему. В вашем представлении (страница aspx) вы можете проверить наличие нулей ...

Или в методе действия с индексом вы создаете новый экземпляр BalanceViewModel и сохраняете его в TempData, а затем извлекаете его в своем представлении, когда ваша модель равна нулю.

Или в вашем методе действия вы могли бы также вызвать return View («Учет», new BalanceViewModel ()) вместо использования перенаправления на действие.

РЕДАКТИРОВАТЬ: Пример кода - Если вы хотите поделиться этой функцией, создайте приватный метод, подобный этому:

public class CalculatorsController : Controller {
    // GET: /Calculators/
    public ActionResult Index() {
        return View(GetBalanceViewModel());
    }

    public ActionResult Accounting() {
        return View(GetBalanceViewModel());
    }

    private BalanceViewModel GetBalanceViewModel() {
        var combatants = Models.Persistence.InMemoryCombatantPersistence.GetCombatants();
        Debug.Assert(combatants != null);
        var bvm = new BalanceViewModel(combatants);
        Debug.Assert(bvm != null);
        Debug.Assert(bvm.Combatants != null);
        return bvm;
    }
}

Вы видели этот Вопрос?

1 голос
/ 27 марта 2010

Это не столько ответ, сколько обходной путь. Я не уверен, почему вы получаете нулевую модель, так как похоже, что она должна работать. На самом деле, я могу подтвердить поведение, которое вы наблюдаете, когда я сам это пробую. [РЕДАКТИРОВАТЬ: я обнаружил недостаток в моем первоначальном тестовом коде, который вызывал мою собственную нулевую модель. Теперь, когда это исправлено, мой тест работает нормально, используя RedirectToAction.] Если есть причина для этого, я не знаю, как это происходит у меня в голове.

Теперь для обходного пути ... Я предполагаю, что вы делаете это таким образом, поскольку маршрут по умолчанию отправляет весь трафик на http://www.domain.com/Calculators на «Индекс». Так почему бы не создать новый маршрут, подобный этому:

routes.MapRoute(
  "Accounting",
  "Calculators/{action}/",
  new { controller = "Calculators", action = "Accounting" }
);

Этот маршрут задает действие по умолчанию для контроллера калькуляторов: «Учет» вместо «Индекс».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...