RedirectToAction不能满足我的需要。我有什么选择?

时间:2012-02-09 17:38:28

标签: c# asp.net-mvc-3

在我的控制器中,我有类似的东西:

[HttoPost]
public ActionResult MyMethod(MyViewModel myViewModel)   
{  
   //...Some logic  

   return RedirectToAction("SecondMethod", new { ... pupulating view model ... });  
}   

[HttpGet]
public ActionResult SecondMethod()  
{  
    return RedirectToAction("Index", "SomeOtherController");  
}

[HttpPost]
public ActionResult SecondMethod(MyViewModel myViewModel)  
{  
   //...Do Something
   return View("MyView", myViewModel);  
}

显然,MyMethod动作中的RedirectToAction永远不会调用我需要的HttpPost。问题是,如果我执行以下操作:

return SecondMethod(myViewModel);

相反,浏览器上显示的网址是 ... / ... / ... / MyMethod ,我需要它 ... / ... /.../ SecondMethod

我可以做什么,以便我可以点击HttpPost操作并在浏览器上显示正确的URL?

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

您可以创建一个非操作方法,然后从MyMethod()SecondMethod()调用它:

private void DoStuff()
{
    //...Do Something
}

public ActionResult MyMethod(MyViewModel myViewModel)   
{  
   //...Some logic
   DoStuff();  

   return RedirectToAction("SecondMethod", new { ... pupulating view model ... });  
}   

[HttpGet]
public ActionResult SecondMethod()  
{  
    return RedirectToAction("Index", "SomeOtherController");  
}

[HttpPost]
public ActionResult SecondMethod(MyViewModel myViewModel)  
{  
   DoStuff();
   return View("MyView", myViewModel);  
}

答案 1 :(得分:0)

听起来你实际上并不需要HttpPost;您只需要在相应的HttpGet操作中使用该方法的功能,该操作接受MyViewModel的实例,并返回由该模型填充的视图。听起来不错吗?

如果是这样,请尝试以下方法:

[HttpGet]
[ActionName("SecondMethod")]
public ActionResult SecondMethodWithViewModel(MyViewModel myViewModel)
{
    return View("MyView", myViewModel);
}

您可以使用ActionNameAttribute重载您的操作,因为您无法声明与HttpPost操作具有相同签名的其他方法。 RedirectToAction()调用和网址将尊重您在此属性中设置的值,因此您可以根据需要为方法命名。

答案 2 :(得分:0)

如果您要发布到操作,则需要POST到该操作。我的建议是改变行动发生的方法。如果它是通过单击按钮启动的,那么在页面上单独发布多个表单或者在提交使用JavaScript来更改发布表单的操作属性之前会更简单。