ASP.NET MVC3 Отправка формы обратно к тому же действию - PullRequest
0 голосов
/ 04 июля 2011

У меня есть действие в моем HomeController (для простоты):

[HttpGet]
[HttpPost]
public ActionResult MyAction(MyOwnViewModel viewModel)
{
    // do some stuff with the viewmodel and return it to the view.
    // Selected values should be preserved inside the viewModel

    return View(viewModel);
}

И я хочу, чтобы это действие вызывалось всякий раз, когда я перехожу на URL / Home / MyAction.Он жалуется, что не может найти метод MyAction на HomeController, и я подозреваю, что это из-за параметра viewModel.

Есть ли способ обойти это?Я ожидаю, что параметр viewModel будет нулевым.

Ответы [ 4 ]

1 голос
/ 05 июля 2011

Ответ в этом случае заключается в удалении одного или обоих фильтров действий [HttpGet] и [HttpPost] .

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

В таких обстоятельствах MVC ModelBinder сгенерирует для вас пустой экземпляр класса модели.

Посмотрите интерфейс IModelBinder для получения дополнительной информации о привязке пользовательской модели.

0 голосов
/ 04 июля 2011

Насколько я знаю, я не знаю, как и почему вы должны передать свою собственную модель представления своему действию, посетив URl, но, учитывая ваш упомянутый сценарий, я постараюсь помочь вам исправить недостающее поведение действия. и способ его обнаружения в ASP.NET MVC.

Вы правы, поскольку из-за вашего параметра viewModel маршрут MVC3 по умолчанию не найдет это действие, поэтому вам нужно определить новый маршрут, соответствующий вашему действию контроллера.

рассмотрите следующий код:

routes.MapRoute(
             "SearchRoute1",                                              // Route name
             "MyAction/{viewModel}",                             // URL with parameters
             new { controller = "Home", action = "MyAction", viewModel = "" }  // Parameter defaults

         );

вы определите что-то вроде этого внутри вашего Global.ASAX файла, в частности, внутри RegisterRoutes(RouteCollection routes) метода, чтобы таблица маршрутизации вашего приложения знала о вашем методе действия, тогда вы можете обработать запрос как обычно.

Дайте мне знать, помогло ли это вам, спасибо.

0 голосов
/ 04 июля 2011

Нельзя иметь один ActionResult с двумя разными методами HTTP. Вам нужно использовать перегрузки ...

public ActionResult MyAction()
{
     return View(new MyViewModel());
}

И

[HttpPost]
public ActionResult MyAction(MyViewModel model)
{
     // Do your stuff...
     return View(model);
}
0 голосов
/ 04 июля 2011

Вам нужно одно действие без параметра, чтобы запустить его с URL-адреса

public ActionResult MyAction()
{

    return View();
}

И использовать то, которое вам уже нужно, для обработки отправленного действия (здесь применяется атрибут HttpGet или HttpPost для) с этой точки зрения, так что у вас будет viewModel к тому времени.

...