c#.net访问父对象
我正在使用.NETC#MVC控制器为我的许多项目查询数据库。每次我创建一个新控制器时,我发现自己必须为新控制器重写一些相同的函数。因此,我考虑编写一个基本控制器来处理我在所有控制器中使用的一些基本任务(例如,运行查询并运行json) 在我的控制器中,我像这样引用基本控制器c#.net访问父对象,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我正在使用.NETC#MVC控制器为我的许多项目查询数据库。每次我创建一个新控制器时,我发现自己必须为新控制器重写一些相同的函数。因此,我考虑编写一个基本控制器来处理我在所有控制器中使用的一些基本任务(例如,运行查询并运行json) 在我的控制器中,我像这样引用基本控制器 namespace myWebAPI.Controllers { public class esrcController : Controller { // // GET: /e
namespace myWebAPI.Controllers
{
public class esrcController : Controller
{
//
// GET: /esrc/
string db = "esrc-";
basicController BasicController = new basicController();
public string test()
{
return "test" + Request.ServerVariables["HTTP_REFERER"];
}
public string getCodingException()
{
return @"{""data"":" + BasicController.getDataNconvertToJSON(
"select * from z_codingexception order by nc_key",
BasicController.getEnviroment(db)) + "}";
}
}
}
在我的BasicController
中,getEnvironment
查看url以确定环境,因此我需要访问:
Request.ServerVariables["HTTP_REFERER"] and Request.ServerVariables["HTTP_HOST"].ToString().ToLower();
但此控制器中的请求为空,我只能访问主控制器中的请求。如何从基本控制器引用httpRequest?仅仅因为您实例化了控制器的新实例,并不意味着您可以访问上下文 一个选项是创建一个抽象的基本控制器,您的所有其他控制器都可以从中获得它。然后您可以访问特定对象,如
Request
WebApiConfig.cs
config.MapHttpAttributeRoutes();
您的控制器
public abstract class MyBaseController : Controller
{
protected void myMethod()
{
// you have access to Request here
}
}
public class MyController : MyBaseController
{
[HttpGet]
[Route("my/getstuff")]
public IHttpActionResult GetStuff()
{
// do stuff
base.myMethod();
return Ok();
}
}
实例化控制器的新实例并不意味着您可以访问上下文 一个选项是创建一个抽象的基本控制器,您的所有其他控制器都可以从中获得它。然后您可以访问特定对象,如
Request
WebApiConfig.cs
config.MapHttpAttributeRoutes();
您的控制器
public abstract class MyBaseController : Controller
{
protected void myMethod()
{
// you have access to Request here
}
}
public class MyController : MyBaseController
{
[HttpGet]
[Route("my/getstuff")]
public IHttpActionResult GetStuff()
{
// do stuff
base.myMethod();
return Ok();
}
}
创建一个动作过滤器,并将其作为属性添加到该类中。在操作筛选器中,YOU将有权访问
请求
对象。如果覆盖OnActionExecuting
功能,则过滤器中的功能将在控制器之前执行
创建自定义筛选器
public class CustomAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//DO STUFF WITH YOUR REQUEST OBJECT HERE..
}
}
将过滤器作为属性添加到控制器
[CustomAttribute]
public class esrcController : Controller
创建一个动作过滤器,并将其作为属性添加到该类中。在操作筛选器中,YOU将有权访问
请求
对象。如果覆盖OnActionExecuting
功能,则过滤器中的功能将在控制器之前执行
创建自定义筛选器
public class CustomAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//DO STUFF WITH YOUR REQUEST OBJECT HERE..
}
}
将过滤器作为属性添加到控制器
[CustomAttribute]
public class esrcController : Controller
为什么不把它完全放在一个单独的类中呢?为什么不遵循标准的.NET命名约定呢?一个想法是可以将这个controllercontext传递到基类的构造函数参数中,还有这个设置的目的是什么?对不起,我对这个有点陌生,你说完全独立的类是什么意思?我将研究.NET命名conventions@chungtinhlakho为什么不把它完全放在一个单独的类中呢?为什么不遵循标准的.NET命名约定呢?一个想法是可以将这个controllercontext传递到基类的构造函数参数中,还有这个设置的目的是什么?对不起,我对这个有点陌生,你说完全独立的类是什么意思?我将研究.NET命名conventions@chungtinhlakho这个答案似乎没有解决问题,动作过滤器是一个非常有用的功能,但我不知道它在这里是如何应用的,你介意扩展吗?这触及到他试图做的核心:在每个控制器上执行功能并访问
请求
对象。很抱歉不同意你的观点。这看起来就像你在炫耀你对过滤器的知识,这简直是侮辱。我无意炫耀,无意冒犯你。当您所做的只是执行一些代码时,过滤器不会增加很多价值。如果希望它简短,请显式编写它并使用助手。当您想要变形请求、注入额外数据或预先为控制器方法设置内容时,它们非常有用。仅仅因为模式存在,并不意味着您想要应用它并进一步模糊代码。虽然我不喜欢使用基类是一种代码重用模式,因为它们是对OOP的滥用,但这是一种务实的方法。这个答案似乎没有解决问题,动作过滤器是一个非常有用的功能,但我不知道它在这里是如何应用的,你介意扩展吗?这触及到他试图做的核心:在每个控制器上执行功能并访问请求
对象。很抱歉不同意你的观点。这看起来就像你在炫耀你对过滤器的知识,这简直是侮辱。我无意炫耀,无意冒犯你。当您所做的只是执行一些代码时,过滤器不会增加很多价值。如果希望它简短,请显式编写它并使用助手。当您想要变形请求、注入额外数据或预先为控制器方法设置内容时,它们非常有用。仅仅因为模式存在,并不意味着您想要应用它并进一步模糊代码。虽然我不喜欢使用基类是一种代码重用模式,因为它们是对OOP的滥用,但这是一种务实的方法。我尝试过这样做,如果我将MyBaseController更改为public,就会得到“不一致的可访问性:基类'MyBaseController'的可访问性不如类'MyControllerController'”,这个错误消失了,但是如果我尝试去做的话,会得到一个404。感谢您的帮助。假设您使用的是web api,则需要设置适当的路由才能调用该方法。查看更新的回答查看我在web api方法上添加的属性我尝试过这样做,得到“不一致的可访问性:基类'MyBaseController'比类'MyControllerController'更难访问”,如果我将MyBaseController更改为public,错误会消失,但如果我尝试转到它,则会得到404。感谢您的帮助。假设您使用的是web api,则需要设置适当的路由才能调用该方法。请参阅更新的回答请参阅我在web api方法上添加的属性