如何从我的带参数的控制器返回不同的ActionResult?

时间:2016-06-14 17:28:03

标签: c# asp.net-mvc

我有一个Controller,其中有一些操作,如下所示:

[HttpPost]
public ActionResult Create(CreateModel model)
{
    if (model.SelectedCustomers.Count > 0 &&
        model.SelectedVersions.Count > 0 &&
        !string.IsNullOrWhiteSpace(model.ScriptName) &&
        !string.IsNullOrWhiteSpace(model.ScriptText))
    {

        Script script;
        ...save to database...
        return Edit(script.Id);   //<---------Return other view here
    }
    else
    {
        ...
    }
}

[HttpGet]
public ActionResult Edit(int? scriptId)
{
    return View();
}

运行Create操作并成功将模型保存到数据库后,我想将用户发送到新创建的脚本的Edit视图。当我使用上面的代码时,特别是return Edit(script.Id);,它只会将用户发送回Create视图而不是Edit视图。当用户直接导航到Edit操作时,或通过指向Html.ActionLink的{​​{1}}结果时,一切正常。

我做错了什么?

3 个答案:

答案 0 :(得分:7)

这不符合你的想法:

IAuthWithRequest

实际上并没有告诉框架去做那个动作。它只是返回方法的返回值。在涉及ASP.NET MVC框架的任何组件之前,纯粹是一个C#问题。什么是回报值:

return Edit(script.Id)

所以前者真的在功能上与后者相同。每当你在ASP.NET MVC中使用return View() 时,框架将通过检查当前被调用的动作来确定该视图,在本例中为return View()

您想要的不是返回Create视图(即使您这样做,在这种情况下,用户仍然在Edit 网址上,造成混乱)。你想要的是返回一个重定向来告诉客户 请求下一步行动:

Create

答案 1 :(得分:4)

您始终可以致电RedirectToAction并返回该操作结果。这将通知浏览器重定向到不同的操作。

我认为你需要这样的东西:

return RedirectToAction("Edit", new { scriptId = script.Id });

直接调用Edit与调用方法没什么不同。

答案 2 :(得分:2)

您可以使用输入参数RedirecToAction进行此操作。

return RedirectToAction("Action", new { id = 12 });

在你的情况下:

return RedirectToAction("Edit", new { scriptId = script.Id });