MVC从另一个方法返回视图

时间:2017-11-14 13:20:49

标签: asp.net-mvc

我无法在某些情况下结束回复

例如下面(在上传操作方法中),如果调用了Logerror方法,我只想返回视图(浏览器)而无需进一步操作。即从上传行动方法返回         Plase找到修改后的问题我想要实现的目标, 如果出现错误,我想通过停止所有进一步的操作来返回视图

    public ActionResult Index()
    { 
       return View();
    }


    public ActionResult Upload()
    {

       int i=1;
       DoSomethingFirst();  
       //if LogError i dont want execute code below, rather it should end responce
       //should not reach here  

       string s="This should not be executed in case of LogError()";

       return View("Index");

    }

    public void DoSomethingFirst()
    {

       try{
           DoSomethingSecond();
       }
       catch(exception ex)
       {
           LogError();
       }

    }

    public void DoSomethingSecond()
    {

       try{
           DoSomethingThird();
       }
       catch(exception ex)
       {
           LogError();
       }

    }


    public void DoSomethingThird()
    {

       try{
           DoSomethingother();

       }
       catch(exception ex)
       {
           LogError();
       }

    }   


    private LogError()
    {
        Viewbag.Error="Error details";
        return View("Index");
    }

1 个答案:

答案 0 :(得分:1)

这不会返回当前方法的结果:

DoSomething();

但是这个确实:

return DoSomething();

如果要结束当前方法的执行,则需要执行退出方法的操作。基本上,要么从方法返回,要么抛出异常。由于DoSomething会返回结果,因此您可能希望返回 结果。因此,只需在调用方法时添加return语句。

  

我尝试了RedirectToAction(“索引”);

同样的问题。您需要返回结果:

return RedirectToAction("Index");

修改:根据您对问题的修改,整体概念仍然存在。在这里关注代码的这一部分:

var s = DoSomethingFirst();  
//if true i dont want execute code below, rather it should end responce
//should not reach here

要退出C#中的方法任何方法,您需要returnthrow。所以第一个问题是......你想在这做什么?例如,如果要返回重定向,则返回重定向:

return RedirectToAction("SomeAction");

如果要返回默认视图,请返回:

return View();

如果你想抛出异常:

throw SomeException("Some Message");

选择权在你手中。你只需要定义:

  1. 您希望此方法在此条件下返回或投掷。
  2. 你怎么知道这种情况。
  3. 对于第二点,您的代码评论说:

    //if true ...
    

    这是否意味着DoSomethingFirst()返回bool表示成功或失败?那么这将是一个简单的if语句:

    if (!DoSomethingFirst())
        return View();
    

    另一个编辑:根据您的评论:

      

    内部LogError mehod由action方法中的任何子方法调用,我想用错误消息更新视图并结束操作而无需进一步操作

    您的Update方法如何知道内部调用的内容称为LogError()DoSomethingFirst()返回的哪些信息表明了这一事实?目前它没有。您的各种DoSomething方法都是吞咽异常,这意味着它们在内部处理异常,因此消费代码不会了解它们。

    如果您想要使用代码来了解异常,请重新抛出该异常。例如:

    public void DoSomethingFirst()
    {
        try
        {
            DoSomethingSecond();
        }
        catch(exception ex)
        {
            LogError();
            throw; // <-- this will re-throw ex without modifying it
        }
    }
    

    这将返回DoSomethingFirst()的信息,特别是发生错误的事实。然后,您的消费代码可以检查该错误:

    try
    {
        DoSomethingFirst();
    }
    catch (Exception ex)
    {
        // You should *probably* do something with ex too.  So far all of your "logging" has been ignoring the actual error.
        return View();
    }
    

    无论您构建什么结构,基础都不会改变。为了使代码能够了解它调用的代码,该调用的代码必须公开该信息。要结束方法的执行,您必须returnthrow。如果您希望使用代码响应来处理这些异常,请不要隐藏使用代码的异常。