2015-04-17 2 views
3

Если у меня естьперенаправление на действие в недействительной функции

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

RedirectToAction («Index») должен быть возвращен в Join, что означает, что IsNull также должен будет вернуть его, что делает его несколько избыточным. Я считаю, что лучше всего придерживаться If (id == null) return RedirectToAction («Index»), там нет достаточной сложности, чтобы заслужить отдельный метод для этого, на мой взгляд. –

+0

Насколько я считаю, вы не можете использовать 'RedirectToAction' без возвращаемого типа (ActionResult). –

+1

У вас все хорошо. Абстрагирование здесь не кажется хорошей идеей (но см. Некоторые ответы для работы, если несколько запутанные решения) – Martijn

ответ

-1

Второй метод не возвращает ActionResult. сделать void в результате действий и возвращение RedirectToAction

+1

ok Я сделал это. НО, если этот идентификатор не будет нулевым, что вернуть в это действие? Посмотреть? это будет неправильно – gsiradze

+1

Вы добавляете сложность там, где это не нужно. Придерживайтесь того, что у вас было изначально, так как вам всегда нужно сопоставить то, что IsNull() возвращается, чтобы решить, возвращать его или нет в Join(), что означает другое If, если потребуется. Ваш лучший выбор - просто придерживаться оригинала if (id == null), вместо того, чтобы превращать его в if (IsNull (id)). –

1

Если Join действие требует id, то не делают id Nullable:

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

    return View(); 
} 
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(); 
    }); 
} 
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); 
     } 
} 

, но к настоящему времени мы определенно оставили царство хороших идей.

Смежные вопросы