1

有人可以帮我找出问题所在并且仍然向我解释控制器如何知道它应该使用哪个路由定义(因为在很多情况下,URI 可以适应多个路由定义)?

这是我的问题...

控制器方法:

[HttpGet]
public ActionResult PreencherFormulario(int idPacientePesquisa, int idFormularioPesquisa) 

路线(所有在 Global.asax 上定义):

protected void Application_Start()
{
    RouteTable.Routes.MapRoute(
        "Busca",
        "{controller}/{action}/{SearchString}/{SearchSubString}/{id}"
    );
    RouteTable.Routes.MapRoute(
        "Participacao",
        "{controller}/{action}/{id}"
    );
    RouteTable.Routes.MapRoute(
        "ParticipacaoPesquisa",
        "{controller}/{action}/{idPesquisa}/{nrProntuario}",
        null,
        new { idPesquisa = @"\d+" }
     );

    //!!! This should be the one used...
    RouteTable.Routes.MapRoute(
        name: "PreencherForm",
        url: "{controller}/{action}/{idPacientePesquisa}/{idFormularioPesquisa}",
        defaults: new { idPacientePesquisa = 1, idFormularioPesquisa = 1 },
        constraints: new { idPacientePesquisa = @"\d+", idFormularioPesquisa = @"\d+" }
     );

    RouteTable.Routes.MapRoute(
        "AdicionarRegraCID",
        "{controller}/{action}/{a}/{b}/{c}",
        new { controller = "Pesquisas", action = "AdicionarRegraCID", MetodoResultado = "", MetodoCancelar = "" }
    );

网址:

http://localhost:61404/RealizacaoPesquisa/PreencherFormulario/1/1

错误:

The parameters dictionary contains a null entry for parameter 'idPacientePesquisa' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult PreencherFormulario(Int32, Int32)' in 'Prometheus.Controllers.RealizacaoPesquisaController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
Nome do parâmetro: parameters
4

2 回答 2

1

您的问题在于以下路由默认为 null ,因为该路由位于您怀疑的路由之前,并且 routeurl 的格式与下一个路由的格式相同。该路由被考虑并且在路由时失败,因为您的操作参数是不可为空的 int。

  RouteTable.Routes.MapRoute(
        "ParticipacaoPesquisa",
        "{controller}/{action}/{idPesquisa}/{nrProntuario}",
        null, /*<--- This is the culprit*/
        new { idPesquisa = @"\d+" }
  );

请记住,路由的顺序很重要,您也应该将默认路由保留在底部。将路线上方的路线移至相关路线下方。您需要重新安排路线。这是发生的事情:

你点击了网址:http://localhost:61404/RealizacaoPesquisa/PreencherFormulario/1/1

它查看路由表并找到第一个匹配项,即

"{controller}/{action}/{idPesquisa}/{nrProntuario}",

因此,它会尝试使用idPesquisa此路由中映射的参数调用您的操作。

但是您的操作需要其他内容作为参数名称,并且它们也不能为空,因此如果失败。

于 2013-10-12T23:22:47.527 回答
1

首先,您要编写从更具体到更一般的路线。它使用它匹配的第一个。

因此,您的问题是您的路线与此路线匹配,并且您将 idPacientPesqusa 设置为空。

 RouteTable.Routes.MapRoute(
        "ParticipacaoPesquisa",
        "{controller}/{action}/{idPesquisa}/{nrProntuario}",
        null, <-- here!!
        new { idPesquisa = @"\d+" }
     );

看来您正在尝试为每个控制器/操作设置一个路由,以便您可以执行类似的操作

 RouteTable.Routes.MapRoute(
        name: "PreencherForm",
        url:"RealizacaoPesquisa/PreencherFormulario/{idPacientePesquisa}/{idFormularioPesquisa}",
        defaults: new { controller = "RealizacaoPesquisa", action = "PreencherFormulario", idPacientePesquisa = 1, idFormularioPesquisa = 1 },
        constraints: new { idPacientePesquisa = @"\d+", idFormularioPesquisa = @"\d+" }
     );
于 2013-10-12T23:37:47.463 回答