MVC路由数据不可用

时间:2017-06-20 20:53:59

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

我有一个名为BaseController的控制器。在BaseController中,我有一个名为Index的Action方法,它有一些逻辑,包括查询路由和构建URL。有点像:

var link = Url.RouteUrl("myroute", new { id = 5 });

所有这一切都很好,直到我创建一个扩展BaseController的控制器NewController。在NewController的构造函数中,我将BaseController作为依赖项传递。

public class NewController
{
  private BaseController _baseController;

  public NewController(BaseController baseController)
  {
    _baseController = baseController;
  }

  public ActionResult Index()
  {
    return _baseController.Index();
  }
}

为什么需要这样做是因为我需要覆盖视图(一些HTML和CSS更改)。我不想重新创建模型和服务并重写业务逻辑,所以认为这将是最好和最有效的方法。

唯一的问题是在调用BaseController的索引操作时,Url显然为空。路由数据不可用,因为请求是在基本控制器之外生成的。

解决这个问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

您正尝试从另一个控制器调用操作方法。您的构造函数方法可以将baseController作为null。你能尝试像下面那样实现它吗

public ActionResult Index()
{
    return new BaseController().Index(); // assume you call index action
}

或者你可以从另一个控制器调用BaseController动作,如下面的

public ActionResult Index() 
{
   return RedirectToAction("Index", "Base"); // assume you call index action
}

您还可以更改路线网址,如下所示。

@Url.RouteUrl("myroute", new { controller = "Base", action = "Index", id = 5 })

答案 1 :(得分:0)

BaseController.Index()虚拟:

public class BaseController : Controller
{
    public virtual ActionResult Index()
    {
        return View();
    }
}

然后使用继承:

public class NewController : BaseController
{
   public override ActionResult Index()
   {
      var index = base.Index();
      //do whatever
      return index;
   }
}

答案 2 :(得分:0)

我有另一种解决方案需要一些代码设计工作。

为什么你抽象你的业务逻辑远离两个Controllers

例如:RouteBuilder.cs一个具有包含构建路由逻辑的函数的类。

BaseClass.cs是一个包含两个控制器之间共享逻辑的类。

,然后

public class BaseController
{
   public ActionResult Index()
   {``
      //Instantiase BaseClass.cs and call the needed functions. Then RouteBuilder.cs and call functions.
      return View();
   }
}


public class NewController
{
   public ActionResult Index()
   {``
      //Instantiase BaseClass.cs and call the needed functions.
      return View();
   }
}

中提琴。解决了问题并生成了干净的代码。