mvccontrib测试助手并验证http post路由和参数

时间:2011-08-23 17:17:47

标签: asp.net asp.net-mvc url-routing mvccontrib

这是一个例子。假设您有以下操作:

public AccountController : Controller
{
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Foo(string id) 
    {
        return View();
    }
}

注册以下路线:

RouteTable.Routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "home", action = "index", id = "" }
);

我测试它是这样的:

var routeData = "~/account/foo".WithMethod(HttpVerbs.Post);
routeData.Values["id"] = "123";
routeData.ShouldMapTo<AccountController>(c => c.Foo("123"));

但这项工作也适用于Get,而且无需工作:

var routeData = "~/account/foo".WithMethod(HttpVerbs.Get);
routeData.Values["id"] = "123";
routeData.ShouldMapTo<AccountController>(c => c.Foo("123"));

为什么?

更新1:

我的真实方法是:

public ActionResult Novo()
{
    NovoViewModel novoViewModel = new NovoViewModel();
    novoViewModel.Sexos = GetSexos();
    novoViewModel.Status = GetStatus();

    return View(novoViewModel);
}

[HttpPost]
public ActionResult Novo(NovoViewModel novoViewModel)
{
    //Validações de autenticação
    if (_authenticationService.IsUserRegistered(novoViewModel.NomeUsuario))
    {
        ModelState.AddModelError("ExistingUsername", String.Format(ViewModelValidations.ExistingUsername, "Usuário"));
    }

    if (_usuarioRepository.PegaUsuarioPorEmail(novoViewModel.Email) != null)
    {
        ModelState.AddModelError("ExistingEmail", String.Format(ViewModelValidations.ExistingEmail, "Email"));
    }

    if (ModelState.IsValid) {
        Usuario usuario = new Usuario()
                                {
                                    Nome = novoViewModel.Nome,
                                    Email = novoViewModel.Email,
                                    Telefone = novoViewModel.Telefone,
                                    DataNascimento = Convert.ToDateTime(novoViewModel.DataNascimento),
                                    Sexo = !String.IsNullOrEmpty(novoViewModel.SexoSelecionado) ? (Sexo?)(Convert.ToByte(novoViewModel.SexoSelecionado)) : null,
                                    Credencial = new Credencial()
                                                    {
                                                        NomeUsuario = novoViewModel.NomeUsuario,
                                                        Senha = novoViewModel.Senha,
                                                        Status = (Status)Convert.ToByte(novoViewModel.SexoSelecionado)
                                                    }
                                };

        _usuarioRepository.Add(usuario);

        _dbContext.SaveChanges();

        return RedirectToAction("Index");
    }

    novoViewModel.Sexos = GetSexos();
    novoViewModel.Status = GetStatus();

    return View(novoViewModel);
}

1 个答案:

答案 0 :(得分:0)

尝试将id放入您正在测试的网址中:

var routeData = "~/account/foo/123".WithMethod(HttpVerbs.Post);
相关问题