2017-02-07 5 views
5

У меня возникла ситуация, когда я хочу перенаправить/показать какой-то url/action, когда результат будет успешным, но вернуться к просмотру, если была некоторая ошибка.Asp.Net Core перенаправляет на действие, но не позволяет непосредственно вызывать действие?

Например, когда someWork возвращает true, я хотел бы показать «успешную страницу» с некоторыми данными, но когда она ложна, я вернусь на страницу и покажу ошибки.

Обычно ChildAction сможет это сделать, но в .Net Core они, кажется, отсутствуют.

Что было бы лучшим способом достичь этого? Моя главная проблема заключается в том, что маршрут/действие «успех» не должен быть напрямую доступен, если кто-то пишет его в браузере.

public IActionResult DoSomething() 
{ 
    bool success = someWork(); 
    if (success) 
    { 
     // goto some action but not allow that action to be called directly 
    } 
    else 
    { 
     return View(); 
    } 
} 
+0

Несмотря на то, что вы можете подумать, вы бы не смогли использовать метод '[ChildActionOnly]' в предыдущих версиях –

ответ

3

Одно решение (или, скорее, обходной путь) заключается в использовании данных для хранения временных логического значения и проверить его в другом действии. Пример:

public IActionResult DoSomething() 
{ 
    bool success=someWork(); 
    if(success) 
    { 
     TempData["IsLegit"] = true; 
     return RedirectToAction("Success"); 
    } 
    else 
    { 
     return View(); 
    } 
} 

public IActionResult Success 
{ 
    if((TempData["IsLegit"]??false)!=true) 
     return RedirectToAction("Error"); 
    //Do your stuff 
} 
0

ASP.NET Core имеет новую функцию View Components. Компоненты просмотра состоят из двух частей, класса и результата (обычно это вид бритвы). Компоненты просмотра недоступны напрямую как конечная точка HTTP, они вызываются из вашего кода (обычно в виде). Их также можно вызвать из контроллера, который наилучшим образом соответствует вашим потребностям. Создать представление бритвы для сообщения об успешном

<h3> Success Message <h3> 
Your Success Message... 

Создать соответствующий вид компонент

public class SuccessViewComponent : ViewComponent 
{ 
    public async Task<IViewComponentResult> InvokeAsync() 
    { 
     return View(); 
    } 
} 

Обратите внимание, что имя вида и имя компоненты просмотра и путь для этих файлов следуют конвенциям, очень похожие на контроллер и представления. Обратитесь к основной документации ASP.NET для нее.

Вызов компонента вида из метода действия

public IActionResult DoSomething() 
{ 
    bool success=someWork(); 
    if(success) 
    { 
     return ViewComponent("Success"); 
    } 
    else 
    { 
     return View(); 
    } 
} 
0

Вы можете просто сделать действие частным.

public IActionResult DoSomething() 
{ 
    bool success = someWork(); 
    if (success) 
    { 
     // goto some action but not allow that action to be called directly 
     return MyCrazySecretAction(); 
    } 
    else 
    { 
     return View(); 
    } 
} 

private IActionResult MyCrazySecretAction() 
{ 
    return View(); 
}