重用控制器

时间:2015-12-08 11:45:42

标签: asp.net-mvc razor

是否可以在ASP MVC中重用控制器?如果是这样的话?

也许重复使用不是正确的词。情况是我有一个菜单和子菜单导航栏如下所示(实际上还有另一个导航栏显示的内容) - 我知道配色方案需要一些工作

Nested navigation

上方栏是从数据库中填充的,因此可能有多于或少于3个计划。

下栏始终具有相同的三个条目。无论选择哪个计划,每个条目的视图都是相同的,尽管它们彼此不同。显然,它们中的数据是不同的(从不同的表中填充)。

Plan A -> Suggested Points视图与Plan B -> Suggested Points视图相同。 但Plan A -> Suggested Points视图与Plan A -> Accepted Points视图

不同

为了对我打算使用部分视图的视图执行此操作,可以重复使用相同的视图文件。

但是,如何为控制器执行等效操作?

对于url路径,我想要的是:     /玻璃体/ SuggestedPoints     / PlanB / SuggestedPoints

在我看来,我只想让Plan链接设置一个变量,告诉Points视图他们应该连接哪个数据库。这可能是错误的思考方式,我怀疑它与上面的网址路径建议不符。

2 个答案:

答案 0 :(得分:1)

建议的方法

我建议最好在路线中包含控制器名称,这样您就不会轻易与应用中的其他控制器发生冲突。

您可以修改RouteConfig.cs文件并映射新路线。确保在之前添加自定义路线"默认"之一。

这样的事情:

routes.MapRoute(
    "Plans",
    "Plans/{planName}/{action}",
    new { controller = "Plans", action = "Index" }
);

// Default route here.

然后你会有一个名为Plans的控制器,你的每个动作都有一个名为planName的参数,可以让你识别出可以使用的计划......

public class PlansController : Controller
{
    public ActionResult SuggestedPoints(string planName)
    {
        // create your view here, using the planName to get the correct data.
    }

    public ActionResult AcceptedPoints(string planName)
    {
        // create your view here, using the planName to get the correct data.
    }

    // etc.
}

此方法将允许使用以下格式的网址:

/Plans/PlanA/SuggestedPoints/Plans/PlanA/SuggestedPoints/Plans/PlanB/AcceptedPoints/Plans/PlanB/AcceptedPoints等。

注意:如果您的计划在您的数据库中,那么为计划使用ID可能更有利,但URL看起来不那么友好,这取决于您。

最后,当您想在视图中创建链接时,可以使用以下内容:

@Html.RouteLink("link text", "SuggestedPoints", new { controller = "Plans", planName = "PlanA" })

您的确切请求

如果绝对必须使用您建议的网址格式,那么您可以执行以下操作,这需要为每个操作指定路由,但要小心您需要依赖Action的唯一性名称,以确保他们不与其他控制人发生冲突......

routes.MapRoute(
    "SuggestedPoints",
    "{planName}/SuggestedPoints",
    new { controller = "Plans", action = "SuggestedPoints" }
);

routes.MapRoute(
    "AcceptedPoints",
    "{planName}/AcceptedPoints",
    new { controller = "Plans", action = "AcceptedPoints" }
);

routes.MapRoute(
    "RejectedPoints",
    "{planName}/RejectedPoints",
    new { controller = "Plans", action = "RejectedPoints" }
);

// Default route here.

在这种情况下,控制器将保持与我上面的第一个建议相同。这将允许URL如下:

/PlanA/SuggestedPoints/PlanA/SuggestedPoints/PlanB/AcceptedPoints/PlanB/AcceptedPoints等。

答案 1 :(得分:0)

可能是这样的:

public class PlanController
{
    public ActionResult SuggestedPoints(string plan) //or int planID
    {
       return View();
    }
    public ActionResult AcceptedPoints(string plan) //or int planID
    {
       return View();    
    }
    public ActionResult RejectedPoints(string plan) //or int planID
    {
       return View();    
    }
}

和示例网址:

/Plan/SuggestedPoints/PlanA
/Plan/AcceptedPoints/PlanB