如何构建Actionlinks

时间:2013-04-01 09:05:34

标签: c# asp.net asp.net-mvc

我在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. 当用户点击“兼职时间”时,将显示所选部门的兼职员工。
  4. 我不知道如何构建这些不同链接的操作链接。我瞄准的目标结果是

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

      由于

    5. 更新

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

1 个答案:

答案 0 :(得分:0)

据我所知,我认为您需要的是路由。看看

MVC.Net Routing

和接受的答案。简要说明如何创建自定义路由以实现上述描述。您将需要创建一个控制器,其中包含两个参数string department和另一个参数(字符串或枚举或DefaultModelBinder可以绑定的任何内容)的全部或非全部参数,然后将您的路径映射到这个控制器和行动。

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

假设您创建了一个名为HomeController的控制器,其外观类似于

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

public enum EmployeeType
{
    FullTime,
    PartTime,
}

你可以创建一个actionlink(在任何视图中),如下所示:

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 (无论这意味着什么),就会根据您的需要创建一个带网址的链接。默认实现可以创建一个类似/Home/Index?department=Department1&employeeType=0的网址。然后,您需要从System.Web.Routing.Route派生,覆盖并实施GetVirtualPath并在App_StartGlobal.asax中注册路线。