2016-08-14 7 views
0

ここには、EverythingController内のMovieCustomerアクションメソッドが貼り付けられています。 ViewModelは、2つのモデル:顧客&ムービーを結合するために使用され、ApplicationDbContext(_context)を介してデータベースからの情報が取り込まれます。ASP.NET MVCアトリビュートヌル値を使用したルーティング

のRouteingが正常に動作し、MOVIEIDとCustomerIdのための値

たとえばがある場合、ページをレンダリング/ Everything/MovieCustomer/1/1

いずれかの値または両方の値がnullの場合も、ページをロードします。これまでのところ、両方のintパラメーターはNULL可能であり、いずれかがNULLの場合はパラメーターを1に変更するifステートメントがメソッドにあります。 値がnullの場合、ブラウザは404エラーを返します。

いずれかのパラメータがnullの場合、ページを機能させるにはどうすればよいですか?ありがとう

[Route("Everything/MovieCustomer/{movieId}/{customerId}")] 
public ActionResult MovieCustomer(int? movieId, int? customerId) 
{ 
    var viewmodel = new ComboViewModel 
    { 
     _Customers = new List<Customer>(), 
     _Movies = new List<Movies>(), 
     _customer = new Customer(), 
     _movie = new Movies() 
    }; 
    viewmodel._Customers = _context.Customers.ToList(); 
    viewmodel._Movies = _context.Movies.ToList(); 

    if (!movieId.HasValue) 
     movieId = 1; 

    if (!customerId.HasValue) 
     customerId = 1; 

    viewmodel._customer = viewmodel._Customers.SingleOrDefault(a => a.Id == customerId); 
    viewmodel._movie = viewmodel._Movies.SingleOrDefault(a => a.Id == movieId); 

    return View(viewmodel); 
} 

答えて

4

個別のルートを使用してこれを実現するか、パラメータをオプションに変更します。

3つの属性を使用する場合は、パラメータが指定されていない場合、movieIdのみが指定されている場合、および3つのパラメータがすべて指定されている場合、それぞれのオプションに別々のルートを追加します。

[Route("Everything/MovieCustomer/")] 
[Route("Everything/MovieCustomer/{movieId}")] 
[Route("Everything/MovieCustomer/{movieId}/{customerId}")] 
public ActionResult MovieCustomer(int? movieId, int? customerId) 
{ 
    // the rest of the code 
} 

またあなたは(ルートの定義に?を追加することで)、オプションにあなたのルートのパラメータを変更し組み合わせて、これはあなたが持っているすべての3例カバーする必要があります:

[Route("Everything/MovieCustomer/{movieId?}/{customerId?}")] 
public ActionResult MovieCustomer(int? movieId, int? customerId) 
{ 
    // the rest of the code 
} 

をサンプルサポートでもないことに注意してくださいcustomerIdのみを提供する場合

+0

優秀、ありがとうございます。 – Aarondv1

関連する問題