2011-12-05 8 views
0

まず、私はMVCの完全な理解が不十分であることを謝ります。私はWPFとSilverlightで4年間働いており、MVCアプリケーションを継承しました!追加のパラメータをURLに渡すことを許可する

あなたが現在あなたは現在、次のURLを使用して車両にアクセスすることができ、システムを使用して:最後に

http://localhost:61276/Vehicle/12407 

数は、車両IDであるとコントローラのコードのこの部分を通ります...

public virtual ActionResult VehicleView(int id) 
{ 
    var vehicle = VehicleService.Get(id); 
    return View("VehicleView", new VehicleViewModel { VehicleDetail = vehicle != null ? vehicle.Details : null, Vehicle = vehicle, DetailDisplayType = "features"}); 
} 

最後のパラメータがDetailDisplayTypeです...

私はDetailDisplayType

を変更できるようにする必要があります

私は単純に

public virtual ActionResult VehicleView(int id, string detailDisplayType) 
{ 
    var vehicle = VehicleService.Get(id); 
    return View("VehicleView", new VehicleViewModel { VehicleDetail = vehicle != null ? vehicle.Details : null, Vehicle = vehicle, DetailDisplayType = detailDisplayType }); 
} 

...私はこのような別の方法を追加することによってそれを行うことができると思った。しかし、私は次のエラーを取得しています:

The current request for action 'VehicleView' on controller type 'SearchController' is ambiguous"

は、私が参照する機能を維持する必要がありますディスプレイタイプがなく、オプションのディスプレイタイプを持っている車両...

誰でも正しい方向に私を指揮することができますか?

答えて

1

へのルートの設定。あなたのコードは次のようになります:

public virtual ActionResult VehicleView(int id, string detailDisplayType) 
{ 
    var vehicle = VehicleService.Get(id); 
    return View("VehicleView", new VehicleViewModel { VehicleDetail = vehicle != null ? vehicle.Details : null, Vehicle = vehicle, DetailDisplayType = detailDisplayType??"features" }); 
} 

興味深いのは、アクション本体の2行目の??機能です。 ASP.NET MVCは、URLのどこかに与えられていない場合に備えて、detailDisplayTypeパラメータにnullを送ります(ほとんどの場合、クエリパラメータです)。

0

両方のパラメータを使用する単一のオーバーロードを作成し、2番目のパラメータを省略可能なデフォルト値の"features"に設定する必要があります。

2

detailDisplayTypeパラメータNULL可能にしますし、それはあなたがあなたのコード内でのみシングルVehicleViewアクションを実装することで、あいまいさを解決することができますOptional

routes.MapRoute("VehicleView", "vehicles/{id}/{detailDisplayType}", 
    new { 
     area = "", 
     controller = "vehicles", 
     action = "vehicleview", 
     detailDisplayType = UrlParameter.Optional 
    } 
); 

public virtual ActionResult VehicleView(int id, DetailDisplayType? detailDisplayType) 
{ 
    var vehicle = VehicleService.Get(id); 

    var model = new VehicleViewModel 
    { 
     VehicleDetail = vehicle == null ? null : vehicle.Details, 
     Vehicle = vehicle, 
     DetailDisplayType = detailDisplayType ?? DetailDisplayType.Features 
    } 

    return View("VehicleView", model); 
} 
関連する問題