在ASP.NET MVC 5中管理路由和控制器变量

时间:2014-11-11 21:42:15

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

我试图弄清楚如何使用ASP.NET路由系统,所以我决定开发一个允许管理员管理他们所在的学生和小组的应用程序.I&I #39;我不打算开发数据库,​​因为我现在的目标是决定如何配置路由。

现在我使用以下系统:

我添加了群组控制器来查看和编辑群组。我只提供与群组合作的代码部分和学生省略模型,因为恕我直言他们并不重要。

因此,当您进入组控制器索引页面时,将执行Index方法:

public ActionResult Index()
    {
        var groups = groupManager.GetGroups();
        return View(groups);
    }

组显示如下:

@foreach (var item in Model) 
{
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.Title)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
        @Html.ActionLink("Delete", "Delete", new { id = item.Id }) |
        @Html.ActionLink("Manage students", "Index", "Students", new { id = item.Id }, null)
    </td>
</tr>
}

学生控制器有一个静态变量来保存您正在使用的群组:

public static int currentGroupId;

当您点击“管理学生”时链接,执行学生控制器的索引方法,并通过您选择的组的当前ID:

public ActionResult Index(int? id)
    {
        Group group = groupManager.FindById(id);
        currentGroupId = id.Value;
        return View(studentManager.GetStudentsByGroup(id));
    }

当您编辑/创建/删除学生时,此ID用于将您重定向回学生的控制器索引或将学生附加到该组,如下所示:

public ActionResult Create([Bind(Include = "Id,Title,Group")] Student student)
    {
        if (ModelState.IsValid)
        {
            student.Group = groupManager.FindById(currentGroupId);
            studentManager.Add(student);
            return RedirectToAction("Index/" + currentGroupId);
        }
        return View(student);
    }

如果要返回学生列表,则在编辑视图中使用相同的方法:

@Html.ActionLink("Back to List", "Index/" + StudentsController.currentGroupId)

它工作正常,但我不确定它没关系。我非常不喜欢在控制器中使用静态变量,我也不喜欢它在地址栏中的样子;你有类似&#39; localhost / Students / Index / {groupId}&#39;当你看到学生但你有本地主持人/学生/编辑/ {studId}&#39;当你编辑那对我来说并不好看的学生时,因为这些路线似乎不合逻辑且易于理解。

我尝试使用属性设置路线。我在另一个项目中为学生控制器创建了以下路线(在此示例中,没有用于编辑组的页面,您只需从相应的组页面进入学生页面):

public class StudentsController : Controller
{
    [Route("Groups/Group/{id}/Students")]
    public ActionResult Index(int? id)
    {
        return View();           
    }

    [Route("Students/{studId?}")]
    public ActionResult Student(int? studId)
    {
        return View();
    }

    [Route("Students/{studId}/Edit")]
    public string Edit(int studId)
    {
        return "Editing " + studId;
    }
}

[路线(&#34;群组/群组/ {id} /学生&#34;)] - 此路线用于显示群组中的学生列表。

[路线(&#34;学生/ {studId?}&#34;)] - 此路线用于显示有关用户的信息。

[路线(&#34;学生/ {studId} /编辑&#34;)] - 此路线用于编辑所选用户。

当我想从一个链接跳到另一个链接时,路线工作正常,但是当我想创建学生时,我无法弄清楚如何获得组ID。路线不包含它,我没有任何变量来保持它。

在没有使用静态变量的情况下,是否有人可以推荐一些平滑的方法来实现此功能?也许我应该使用另一条路线,例如,&#39; Groups / Group / {groupId} / Students / {studId} / Edit&#39;这样我就能从路线上获得groupId?

更新

正如我已经理解的那样,静态是真正的失败,但我不知道如何存储有关该组的信息。它在控制器中随处可见。我想我可以尝试将它保存在Html.ActionLink中作为路由参数。但是,它会变得有点复杂,因为每当我必须编写另一个方法时,我必须再次传递该值。

更新2

我终于设法解决了这个问题,尽管不是最好的方式。我已经使用路由属性来设置路径。我已经决定使用类似于&#39; Groups / Group / {groupId} / {Students}&#39;因为我需要groupId从编辑/创建/删除学生页面返回索引。

所以现在看看它的样子:

首先,我已经更改了管理学生页面的链接。该链接显示在每个组附近的组索引页面上。

@Html.ActionLink("Manage students", "Index", "Students", new { groupId = item.Id }, null)

然后我改变了学生的索引方法:

    [Route("Groups/Group/{groupId}/Students")]
    public ActionResult Index(int groupId)
    {
        ViewBag.groupId = groupId; //To use it in the view
        return View(studentManager.GetStudentsByGroup(groupId));
    }

索引视图包含groupId,可以在&#39;中使用它返回索引&#39;编辑/创建/删除页面内的链接:

        <td>
            @Html.ActionLink("Edit", "Edit", new { groupId = ViewBag.groupId, studentId = item.Id }) |
            @Html.ActionLink("Delete", "Delete", new { groupId = ViewBag.groupId, studentId = item.Id })
        </td>

编辑方法如下所示:

   [Route("Groups/Group/{groupId}/Students/Edit/{Id}")]
    public ActionResult Edit(int groupId, int? studentId)
    {
        Student student = studentManager.FindById(studentId);
        return View(student);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    [Route("Groups/Group/{groupId}/Students/Edit/{Id}")]
    public ActionResult Edit([Bind(Include = "Id,Name")] Student student)
    {
        if (ModelState.IsValid)
        {
            var studentWithId = studentManager.FindById(student.Id); 
            var groupId = studentWithId.Group.Id; //Because we don't pass the groupId to the Edit; should fix it ASAP
            var group = groupManager.FindById(groupId);
            student.Group= group;
            studentManager.Edit(student);
            return RedirectToAction("Index", new { groupId = groupId }); //To display the list of the student for that group when you finish editing
        }
        return View(student);
    }

此处使用&#39;返回列表&#39;链接。 ViewBag未被使用,因为模型中已经有了id。

@Html.ActionLink("Back to List", "Index", new {groupId = Model.Group.Id })

我认为这种方式比静态变量更好但我不喜欢将groupId从视图传递给控制器​​,并且每当我必须做某事时都要回来。我不认为ViewData或TempData会在这里工作,因为我必须让用户同时编辑不同的群组,如果我们在点击管理学生按钮时拨打TempData["groupId"] = groupId,它就会成为与静态变量完全相同。我想我现在就把它留下来,也许我以后会想出更好的东西。

0 个答案:

没有答案