2015-04-05 118 views
-1

我已经创建了一个基本控制器,其中我的两个其他控制器来源于,以避免代码重复。如何知道我需要哪个RedirectToAction?

2这些控制器中的ActionResult是大约80行和79行是相同的。唯一的区别是ActionResult结尾的重定向动作。

我的问题是:有没有办法知道需要调用哪个RedirectToAction,即我们需要返回哪个控制器?

+0

“2 ActionResult's in these controllers”意味着方法在派生控制器中。但是你后来在基础控制器中发表的评论。请将您在基本控制器和派生控制器中具有的功能列出,以便清楚明确,而且我们不必猜测。 – AaronLS 2015-04-05 00:37:00

+0

我改了一个字,现在以粗体显示。希望现在清楚:)我在派生控制器中使用了这些方法,现在它们在基本控制器中。 – Forza 2015-04-05 01:14:25

+0

“现在他们在基础控制器中”该信息不在您的问题中。您声明派生控制器中有两种方法,并且您不会说基本控制器中的内容。 – AaronLS 2015-04-05 04:00:22

回答

2

首先,避免使用基础控制器,除非您绝对需要它们。他们倾向于成为垃圾分享的东西,最终你会得到很多只适用于你的控制器的东西,因为它更容易。

这是最好的使它成为一个不使用它们的政策,只有当你绝对必须做出例外。

除此之外,控制器真的应该是精益。如果你的控制器是80行代码,它告诉我你在控制器中做业务逻辑。您应该可以在业务层中使用该逻辑。更重要的是,你可能违反了单一责任原则。

通过利用辅助类,可以在没有基础控制器的情况下实现相同的结果。例如,你可以做这样的事情:

public static class MyHelper 
{ 
    public static Foo DoSomething() { return new Foo(); } 
} 

public class MyController1 : Controller 
{ 
    public ActionResult Index() 
    { 
     var result = MyHelper.DoSomething(); 
     return File(...); 
    } 
} 

public class MyController2 : Controller 
{ 
    public ActionResult Index() 
    { 
     var result = MyHelper.DoSomething(); 
     return JSON(...); 
    } 
} 
1

不是直接,您可以检查模型中的某些情况,并将重定向包裹在if的周围。或者,添加查询字符串参数:

public ActionResult MyAction(MyModel model, string actionRedirect = null) 
+0

在基础控制器中调用ActionResult的方法也在基础控制器:)所以我没有办法改变查询字符串参数..任何方法来解决这个问题? – Forza 2015-04-05 00:22:24

+0

这个想法是,我可以使用该actionRedirect参数来创建一个if语句并选择适当的重定向操作 – Forza 2015-04-05 00:23:00