2017-10-13 136 views
0

我有2个控制器:OpsLinkController VS OpsController如何调用一个方法包含来自其他控制器的会话?

在OpsLinkController我想在OpsController调用一个方法

public ActionResult Index() 
     { 
      // 
      OpsController c = new OpsController(); 
      int i = c.Test(); 
      return View(); 
     } 

在OpsController我有方法

public int Test() 
     { 
      Session["A"] = 1; 
      // Do som thing here 
      return (int)Session["A"]; 
     } 

它抛出一个异常:“系统.NullReferenceException:'对象引用未设置为对象的实例'。“

但是当我们可以通过AJAX从View指数看涨,就OK了:

$.ajax({ 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
       // type: "POST", 
       url: "/Ops/Test", 
       data: {}, 
       success: function (data) { 
        console.log(data); 
       }, 
       err: function (response) { 
        console.log(response); 
       } 
      }); 

结果:1 为什么我们可以通过AJAX EXCUTE法测试,但不能从OpsLinkController EXCUTE?

我们如何从OpsLinkController访问方法测试?

+1

使用重定向从第一个控制器切换到另一个。在'OpsControlControl'.Index()'返回视图并使用'RedirectToAction(“Index”,“Ops”)''重定向之前,将'Test'方法执行放在'OpsController'操作方法(例如'Index') –

+0

为什么你的控制器新增了另一个控制器?这当然不是一个好的做法。如果您拥有多个控制器通用的功能,则它应该位于注入每个控制器的服务中,并且运行时数据(会话状态参数)应作为方法参数传递给服务。您应该永远不需要在当前操作方法之外引用会话状态。 – NightOwl888

+0

谢谢,我会编辑我的控制器 –

回答

1

回答这个问题:我们如何从OpsLinkController访问方法Test?

您不能从OpsLinkController调用Test,因为在这种情况下OpsController的会话不存在。当页面开始,在OpsLinkController

OpsController c = new OpsController(); 
      int i = c.Test(); 

会话你建设OpsController没有创造是

1会话创建。

回答这个问题:为什么我们可以通过ajax执行方法测试?

在ajax中,您一直调用OpsController,这意味着将创建一个Session的OpsController。

url: "/Ops/Test", 

=>就OK了,

但是,如果您的网址是这样的:

url: "/OpsLink /Test", 

的误差会扔“System.NullReferenceException:“对象引用未设置为一个实例object“。”

相关问题