0

我在 asp.net mvc 4 中有以下页面结构。

 Department            Full Time Employees      Part Time Employees
-----------            ---------------------------------------------
Department 1          |1. Employee 1                  
Department 2          |2. Employee 2
                      |

其中第 1 部门、第 2 部门、全职员工和兼职员工是链接。单击任何链接都会显示一些员工。以下是可能的选项

  1. 当用户第一次浏览该页面时,会显示第一个部门(部门 1)的全职员工。
  2. 当用户点击部门 2 时,会显示部门 2 的全职员工(因为已默认选择全职链接)
  3. 当用户单击 Part Time 时,将显示所选部门的兼职员工。

我不知道如何为这些不同的链接构建动作链接。我瞄准的目标结果是

  1. www.example.com/Department1/fulltime
  2. www.example.com/Department1/parttime
  3. www.example.com/Department2/fulltime
  4. www.example.com/Department2/parttime

    谢谢

更新

这里的问题是如何构建动作链接而不是如何将它们路由到控制器。目前我确实有一个行动是我的家庭控制器,它接受部门和全职/兼职。我无法弄清楚的是如何跟踪事情。例如,如果用户在已选择部门 2 的情况下单击 Part Time 链接,Part Time 的链接如何将所选部门传递给操作方法,以便控制器知道它必须显示来自所选部门的兼职员工。与选择了 Part Time 类似,如果用户单击部门,部门链接如何将信息传达给控制器,它必须在单击的部门中显示兼职员工。

4

1 回答 1

0

据我了解,我认为您需要的是routing。看一下

MVC.Net 路由

和接受的答案。有一个简短的解释如何创建自定义路由来实现你上面描述的。您将需要创建一个控制器,其中包含一个带有两个参数的操作,string department以及另一个(字符串或枚举或任何DefaultModelBinder可以绑定的东西)用于全职或兼职,然后将您的路由映射到此控制器和操作。

由于路由是双向的,因此必须正确映射您的路由才能创建正确的操作链接。正如您在msdn中看到的,System.Web.Routing.Route该类还有一个虚拟方法GetVirtualPath。一旦您尝试使用 - 方法(或其重载之一)创建操作链接,框架将“查询”路由(遵守路由约束等)并基于路由值Html.ActionLink构建所谓的虚拟路径假如。

假设您创建了一个名为的控制器HomeController,它看起来类似于

public sealed class HomeController : Controller
{
    public ActionResult Index(string department, EmployeeType employeeType)
    {
        /* ... */
    }
}

public enum EmployeeType
{
    FullTime,
    PartTime,
}

您可以创建一个操作链接(从任何视图中),如下所示:

Html.ActionLink(
    "Full-time employees of department 1",
    "Index", // action
    "Home", // controller
    new
    {
        department = "Department1", // first argument
        employeeType = EmployeeType.FullTime, // second argument
    },
    htmlAttributes: null);

然后,只要匹配的路由GetVirtualPath正确实现(无论这意味着什么),它就会根据您的需要创建一个带有 url 的链接。默认实现可能会创建一个类似/Home/Index?department=Department1&employeeType=0. 然后你需要在or中派生System.Web.Routing.Route、覆盖、实现GetVirtualPath和注册路由。App_StartGlobal.asax

于 2013-04-01T09:46:19.717 回答