在mvc动作中切换/案例,但我没有任何回报

时间:2015-04-27 09:43:14

标签: c# asp.net-mvc

我收到错误,该操作并未在任何路径中返回内容。

你会做什么,我能回到什么意义?抛出异常?

[HttpPost]
public virtual ActionResult ActionName(string actionMode, MyViewModel vm)
{
    switch (actionMode)
    {
        case "yes":
            return RedirectToAction("actionName1");

        case "no":
            return RedirectToAction("actionName2", new { data = vm.data });
    }
}

4 个答案:

答案 0 :(得分:1)

如果您的逻辑是布尔运算,那么为什么不这样做呢?

[HttpPost]
public virtual ActionResult ActionName(string actionMode, MyViewModel)
{
    if (actionMode == "yes")
        return RedirectToAction("actionName1");

    return RedirectToAction("actionName2", new { data = MyViewModel.data });
}

或者,您可以在switch语句之后抛出异常。

throw new InvalidOperationException();

答案 1 :(得分:0)

[HttpPost]
public virtual ActionResult ActionName(string actionMode, MyViewModel)
{
    return actionMode == "yes" ? RedirectToAction("actionName1") : RedirectToAction("actionName2", new { data = MyViewModel.data });
}

答案 2 :(得分:0)

您也可以编写代码: -

[HttpPost]
public virtual ActionResult ActionName(string actionMode, MyViewModel)
{
    switch (actionMode)
    {
        case "yes":
            return RedirectToAction("actionName1");
        default:
            return RedirectToAction("actionName2", new { data = MyViewModel.data });
    }
}

默认值将在没有条件匹配时执行。

答案 3 :(得分:0)

您在switch中收到错误,因为您没有处理另一个字符串值可能会通过。如果您指定默认行为,则可以修复它:

[HttpPost]
public virtual ActionResult ActionName(string actionMode, MyViewModel)
{
    switch (actionMode)
    {
        case "yes":
            return RedirectToAction("actionName1");

        case "no":
            return RedirectToAction("actionName2", new { data = MyViewModel.data });
        default:
            goto case "yes"; // yes behavior by default
    }
}

或者像这样:

default:
    throw new InvalidArgumentException("only 'yes' or 'no' parameter value allowed"); // exception for another values

另一个解决方案是强制你的表单通过" True"或"错误"值而不是"是"或" no",并将其绑定到bool参数,并使用if运算符代替switch

[HttpPost]
public virtual ActionResult ActionName([Bind(Prefix = "actionMode")]bool isYesActionMode, MyViewModel)
// Bind attribute used to get value from old parameter name
{
    if (isYesActionMode)
        return RedirectToAction("actionName1");

    return RedirectToAction("actionName2", new { data = MyViewModel.data });
}