2017-10-13 2 views
0

나는 2 컨트롤러가 "시스템 : OpsLinkController에서메소드 호출시 다른 컨트롤러의 세션을 포함 할 수 있습니까?

내가 OpsController의 방법으로 호출 할 OpsController 대 OpsLinkController을 나는 그것이 예외를 발생

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

방법이 OpsController에

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

.NullReferenceException : '개체 참조가 개체의 인스턴스로 설정되지 않았습니다.' "

하지만 우리가 보기 색인에서 아약스로 호출 할 수 있습니다, 그것은 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 왜 우리가 아약스에 의해 방법의 테스트를 excute에 수 있지만, OpsLinkController에서 excute에 수없는 이유는 무엇입니까?

OpsLinkController에서 Test 메서드에 액세스하려면 어떻게해야합니까?

+1

첫 번째 컨트롤러에서 다른 컨트롤러로 전환하려면 리디렉션을 사용하십시오. 'OpsController' 액션 메소드 (예 :'Index')에'Test' 메소드 실행을 놓고 리디렉션하기 위해'OpsLinkController.Index()'에서 RedirectToAction ("Index", "Ops")를 사용하십시오. –

+0

컨트롤러가 다른 컨트롤러를 새로 시작하는 이유는 무엇입니까? 확실히 좋은 습관은 아닙니다. 여러 컨트롤러에 공통적 인 기능을 가지고 있다면 각 컨트롤러에 주입되는 서비스에 있어야하며 런타임 데이터 (세션 상태 매개 변수)는 메서드 매개 변수로 서비스에 전달되어야합니다. 현재 작업 메서드 외부의 세션 상태를 참조 할 필요가 없습니다. – NightOwl888

+0

감사합니다. 내 컨트롤러를 편집합니다. –

답변

1

질문에 대답 : 어떻게 OpsLinkController에서 Test 메서드에 액세스 할 수 있습니까?

OpsController 세션이이 경우에 존재하지 않으므로 OpsLinkController에서 테스트를 호출 할 수 없습니다. 페이지 시작, OpsLinkController

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

세션에서 당신 건설 OpsController이 예 생성되지 않은 경우 때

1 세션이 생성되었습니다.

질문에 대답 : 왜 우리는 방법 테스트를 실행할 수 있습니다 아약스에 의해?

아약스에서 OpsController를 호출하면 OpsController 세션이 만들어집니다.

url: "/Ops/Test", 

=>이 좋아,

그러나 경우

이처럼 URL :

url: "/OpsLink /Test", 

오류가 던져 "System.NullReferenceException 될 것입니다 :의 인스턴스로 설정되지 않았습니다 '개체 참조 객체 "로 변경하십시오.

관련 문제