在void函数中重定向到动作

时间:2015-04-17 08:58:07

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

如果我有

public ActionResult Join(int? id)
{
   if (id == null)
   {
     return RedirectToAction("Index");
   }

   return View();
}

效果很好。如何使此代码可重用?我必须在许多行动中称呼它。 我试过这个:

public ActionResult Join(int? id)
{
    isNull(id);

    return View();
}

public void isNull(int? id)
{
    if (id == null)
    {
        RedirectToAction("Index");
    }
}

但它没有重定向。

4 个答案:

答案 0 :(得分:1)

如果您的Join操作需要id,请不要让id成为可空的:

public ActionResult Join(int id)
{
   // use id

   return View();
}

答案 1 :(得分:1)

你可以做一些函数式编程:

protected ActionResult WithID(int? arg, Func<int, ActionResult> logic)
{
  if (arg == null)
  {
    return RedirectToAction("Index");
  }

  return logic(arg.Value);
}

这样调用:

public ActionResult Join(int? arg)
{
  return WithID(arg, (id) => 
  {
    return View();
  });
}

答案 2 :(得分:1)

您要做的是尽早返回您的功能,使用不同的功能。那是不可能的。这并不是说取出IsNull是不可能的,而是不切实际的。可能的解决方案可能是

public ActionResult isNull(int? id, Func<ActionResult> _else) {
  if (id == null) {
    return RedirectToAction("Index");
  } else {
    return _else();
  }
}

可以像

一样调用
public ActionResult Join(int? id){
  Func<ActionResult> ifNotNull = () => {
    //do whatever you want here, in your case
    return View();
  }
  return isNull(id, ifNotNull);
}

或直接

public ActionResult Join(int? id){
  return isNull(id, () => View());
}

这是一个好主意是一个不同的问题。

你可能想在其中使用Id,所以你会得到像

这样的东西
public ActionResult isNull(int? id, Func<int, ActionResult> _else) {
      if (id == null) {
        return RedirectToAction("Index");
      } else {
        return _else(id.value);
      }
}

你可以进一步抽象出来

public ActionResult isNull<T>(T id, Func<T, ActionResult> _else) where T: class {
      if (id == null) {
        return RedirectToAction("Index");
      } else {
        return _else(id);
      }
}

public ActionResult isNull<T>(Nullable<T> id, Func<T, ActionResult> _else) {
      if (id == null) {
        return RedirectToAction("Index");
      } else {
        return _else(id.value);
      }
}

但到现在为止,我们肯定已经离开了好主意的领域。

答案 3 :(得分:-1)

第二种方法不返回ActionResult。将void设为操作结果,返回RedirectToAction