ASP.NET MVC3发布表单返回相同的操作

时间:2011-07-04 15:00:49

标签: .net asp.net asp.net-mvc-3 parameters routing

我在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时,我都希望调用此动作。它抱怨它无法在HomeController上找到MyAction方法,我怀疑它是由于viewModel参数。

有什么方法可以解决这个问题吗?我希望viewModel参数只是null。

4 个答案:

答案 0 :(得分:1)

在这种情况下,答案是删除 [HttpGet] [HttpPost] 操作过滤器中的一个或两个。

对于其他人的启发,只要模型类具有公共默认构造函数,就可以使用接受模型参数的操作方法,而不使用该方法的替代无参数版本。

在这种情况下,MVC ModelBinder将为您生成模型类的空实例。

查看 IModelBinder 界面,了解有关自定义模型绑定的更多信息。

答案 1 :(得分:0)

您需要一个没有参数的操作才能从URL

启动它
public ActionResult MyAction()
{

    return View();
}

使用您已经拥有的那个来处理提交的操作(这是申请HttpGetHttpPost属性的位置),从那时起您将拥有viewModel。< / p>

答案 2 :(得分:0)

据我所知,我不知道你将如何以及为什么要通过访问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)方法内, 因此,您的应用程序的路由表应该知道您的操作方法,然后您可以正常处理该请求。

请告诉我这是否对您有所帮助,谢谢。

答案 3 :(得分:0)

您不能使用两种不同的HTTP方法ActionResult。你需要使用重载......

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

[HttpPost]
public ActionResult MyAction(MyViewModel model)
{
     // Do your stuff...
     return View(model);
}