如果我有
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");
}
}
但它没有重定向。
答案 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