如何使用RouteAttributes设计MVC控制器?

时间:2016-04-28 21:51:21

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

我正在开发名为的控制器,最终需要项目编号步骤编号

所以http://myapp/at/5/step/6意味着使用Project = 5和Step = 6

我不想处理所有案件,例如:

http://myapp/at(尝试查找数据库中使用的最后一个项目)

http://myapp/at/1(尝试在项目1的DB中找到步骤)

下面的作品,但我是否比必要的更难?

public class ATController : Controller
{
    [Route("at/{project:int}/step/{step:int}")]
    public ActionResult Index(int project, int step)
    {
        var m = new ATViewModel();
        m.Project = project;
        m.Step = step;
        return View(m);
    }

    [Route("at/{project:int}")]
    public ActionResult ProjectSuppliedNoStep(int project)
    {
        var p = project;
        var s = 33;   //fake lookup
        return RedirectToAction("Index", new { project = p, step = s });
    }

    [Route("at")]
    public ActionResult NoProjectNoStep()
    {
        var p = 7;  //fake lookup
        var s = 33;
        return RedirectToAction("Index", new { project = p, step = s });
    }
}
顺便说一下,这不是一个单元测试。 ProjectSuppliedNoStep NoProjectNoStep 始终返回null。我认为这是因为它正在调用RedirectToAction。

2 个答案:

答案 0 :(得分:0)

可以有多个-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { if ([season selectedRowInComponent:0] == 6) { matches = [[NSMutableArray alloc] initWithCapacity: 20]; [matches insertObject:[NSMutableArray arrayWithObjects:@"aaa", @"bbb", @"1-0", @"15-03-2010", nil] atIndex:0]; } else if . . . [self.tableView reloadData]; } 属性。也许你可以将这个与参数选择结合起来吗?

self

答案 1 :(得分:0)

您可以阅读Attribute Routing in ASP.NET MVC 5以更好地了解它。

参考上面的控制器看起来像......

[RoutePrefix("at")]
public class ATController : Controller
{
    //GET /at/5/step/6
    [Route("{project:int}/step/{step:int}")]
    public ActionResult Index(int project, int step) {
        var m = new ATViewModel();
        m.Project = project;
        m.Step = step;
        return View(m);
    }

    //GET /at/1
    [Route("{project:int}")]
    public ActionResult ProjectSuppliedNoStep(int project) {
        var p = project;
        var s = 33;   //fake lookup
        return RedirectToAction("Index", new { project = p, step = s });
    }

    //GET /at
    [Route("")]
    public ActionResult NoProjectNoStep() {
        var p = 7;  //fake lookup
        var s = 33;
        return RedirectToAction("Index", new { project = p, step = s });
    }
}

以下是您的控制器的一些单元测试,测试时全部通过(绿色)。

[TestClass]
public class MvcControllerAttributeRouteTests : ControllerUnitTests {
    [TestMethod]
    public void Index_Should_Return_ViewResult_With_Model() {
        //Arrange
        int project = 5;
        int step = 6;
        var controller = new ATController();
        //Act
        var actionResult = controller.Index(project, step);
        var viewResult = actionResult as ViewResult;
        //Assert
        Assert.IsNotNull(viewResult);
        Assert.IsNotNull(viewResult.Model);
        Assert.IsInstanceOfType(viewResult.Model, typeof(ATViewModel));
        var viewModel = viewResult.Model as ATViewModel;
        Assert.AreEqual(project, viewModel.Project);
        Assert.AreEqual(step, viewModel.Step);
    }

    [TestMethod]
    public void Project_Supplied_No_Step_Should_Redirect_To_Index() {
        //Arrange
        int project = 1;
        var controller = new ATController();
        //Act
        var actionResult = controller.ProjectSuppliedNoStep(project);
        var result = actionResult as RedirectToRouteResult;
        //Assert
        Assert.IsNotNull(result);
        Assert.AreEqual("Index", result.RouteValues["action"], "the redirection was to at.index action");
        Assert.AreEqual(project, result.RouteValues["project"]);
    }

    [TestMethod]
    public void No_Porject_No_Step_Should_Redirect_To_Index() {
        //Arrange
        var controller = new ATController();
        //Act
        var actionResult = controller.NoProjectNoStep();
        var result = actionResult as RedirectToRouteResult;
        //Assert
        Assert.IsNotNull(result);
        Assert.AreEqual("Index", result.RouteValues["action"], "the redirection was to at.index action");
        CollectionAssert.Contains(result.RouteValues.Keys, "project");
        CollectionAssert.Contains(result.RouteValues.Keys, "step");
    }
}