【问题标题】:How can call a method contain session from Other Controller?如何从其他控制器调用包含会话的方法?
【发布时间】:2018-03-25 02:21:36
【问题描述】:

我有 2 个控制器:OpsLinkController 与 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"];
        }

它抛出一个异常:“System.NullReferenceException: 'Object reference not set to an instance of an object.'”

但是当我们可以从 View Index 中通过 ajax 调用时,就可以了:

$.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可以执行Test方法,OpsLinkController不能执行?

我们如何从 OpsLinkController 访问方法 Test?

【问题讨论】:

  • 使用重定向从第一个控制器切换到另一个。在返回视图之前将Test 方法执行放在OpsController 操作方法(例如Index)上并使用OpsLinkController.Index() 中的RedirectToAction("Index", "Ops") 进行重定向。
  • 为什么你的控制器要更新另一个控制器?这当然不是一个好习惯。如果您有多个控制器共有的功能,它可能应该在注入每个控制器的服务中,并且运行时数据(会话状态参数)应该作为方法参数传递给服务。您永远不需要在当前操作方法之外引用会话状态。
  • 谢谢,我会编辑我的控制器

标签: asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-3


【解决方案1】:

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

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

页面启动时创建的 1 个 Session,当你在 OpsLinkController 中构建 OpsController 时

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

会话尚未创建是的。

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

在 ajax 中,您已被调用到 OpsController,这意味着将创建 OpsController 的会话。

url: "/Ops/Test", 

=> 好吧,

但是如果你的网址是这样的:

url: "/OpsLink /Test",

错误将抛出“System.NullReferenceException: 'Object reference not set to an instance of an object.'”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 2015-03-13
    相关资源
    最近更新 更多