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 = "" }
    );

URL:

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は次のものと同じ形式であるためです。このルートは考慮され、アクション引数が null 許容されない int であるため、ルーティング中に失敗します。

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

ルートの順序は重要であり、デフォルト ルートも一番下に置く必要があることに注意してください。問題のルートの下にルートの上に移動します。ルートを再配置する必要があります。何が起こったかは次のとおりです。

次の URL にアクセスします。http://localhost:61404/RealizacaoPesquisa/PreencherFormulario/1/1

ルーティング テーブルを調べて、最初の一致を見つけます。

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

idPesquisaそのため、このルートにマップされている引数を使用してアクションを呼び出そうとします。

しかし、あなたのアクションはパラメータ名として何か他のものを期待しており、それらもnull不可であるため、失敗した場合.

于 2013-10-12T23:22:47.527 に答える