7

アプリケーションで使用される次のタイプの URL があります。

ローカルホスト/管理者/ユーザー詳細/id

ローカルホスト/管理者/ユーザー詳細/id/true

ローカルホスト/管理者/ユーザー詳細/ID/真/成功

これが私の管理コントローラーです

bool inSaveAction、文字列ステータスはオプションです

    [Authorize]
    public ActionResult UserDetail(string Id, bool inSaveAction, string status)
    {
    }

    [HttpPost, Authorize, ValidateAntiForgeryToken]
    public ActionResult SaveUserDetail(UserDetailViewModel viewModel)
    {
        User userToSave = new User();
        AdminService.UpdateUser(userToSave);
        //This is calling the above function as it sending all 3 params
        return RedirectToAction("UserDetail", new { Id = viewModel.Id, 
                           inSaveAction = true, status = "success" });
    }

以下のケースは機能しません

  @Html.ActionLink("DisplayName", "UserDetail", new { id = Model.Id })

Global.asax で

 routes.MapRoute("UserDetail",
            "UserDetail/{id}",
            new
            {
                controller = "Admin",
                action = "UserDetail",
                id = UrlParameter.Optional
            }
         );

http://haacked.com/archive/2011/02/20/routing-regression-with-two-consecutive-optional-url-parameters.aspxに従いました

UserDetail アクションのオプション パラメータとして inSaveAction & status を作成するにはどうすればよいですか?

4

1 に答える 1

9

ルート構成にパラメーターがありません。(Phil Haack の投稿のように) さまざまなパラメーターをオプションとしてこれを機能させるには、複数のルートを定義する必要があります。

routes.MapRoute("UserDetail-WithStatus", 
                "UserDetail/{id}/{inSaveAction}/{status}", 
                 new
                 {
                     controller = "Admin",
                     action = "UserDetail",
                     // nothing optional 
                 }
);

routes.MapRoute("UserDetail-WithoutStatus", 
                "UserDetail/{id}/{inSaveAction}", 
                 new
                 {
                     controller = "Admin",
                     action = "UserDetail",
                     // nothing optional 
                 }
);

routes.MapRoute("UserDetail-WithoutSaveAction", 
                "UserDetail/{id}", 
                 new
                 {
                     controller = "Admin",
                     action = "UserDetail",
                     id = UrlParameter.Optional
                 }
);

次に、次のリンクを作成します。

@Html.ActionLink("Link", "Index", "Admin", new { id = 1, inSaveAction = true, success = "success" }, null)

また、オプションのパラメーターを null 許容として設定する必要があります。そうしないと、id または inSaveAction が欠落している場合に例外が発生します。

public ActionResult UserDetail(int? id, bool? inSaveAction, string status)
{

}
于 2013-01-05T08:00:41.583 に答える