我在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。
答案 0 :(得分:1)
在这种情况下,答案是删除 [HttpGet] 和 [HttpPost] 操作过滤器中的一个或两个。
对于其他人的启发,只要模型类具有公共默认构造函数,就可以使用接受模型参数的操作方法,而不使用该方法的替代无参数版本。
在这种情况下,MVC ModelBinder将为您生成模型类的空实例。
查看 IModelBinder 界面,了解有关自定义模型绑定的更多信息。
答案 1 :(得分:0)
您需要一个没有参数的操作才能从URL
启动它public ActionResult MyAction()
{
return View();
}
使用您已经拥有的那个来处理提交的操作(这是申请HttpGet
或HttpPost
属性的位置),从那时起您将拥有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);
}