2016-09-07 13 views
0

2つのビューと1つのコントローラがあります。両方に日付ピッカーのコンボボックスがあります。あるビューでは動作しますが、他のビューでは動作しません。ASP.netコア - 同じアクション、2つのビュー:1つのパラメータはnullですが、もう1つは細かいです。

モデル#1:

public class TripDate 
{ 
    public List<DateTime> listDates { get; set; } 
    public DateTime? selectedDate { get; set; } 
} 

モデル#2

public class AdminManageModel 
{ 
    public TripDate date { get; set; } 
    public string FormMessage { get; set; } 
} 

このコードは、ビューで正常に動作ChooseDate.cshtml

@model TripManagement.Models.TripDate  
<form asp-action="ChooseDate" method="post"> 
     <select asp-for="selectedDate"> 
      @if (Model.listDates.Count == 0) 
      { 
       <option>-</option> 
      } 
      else 
      { 
       foreach (var date in Model.listDates) 
       { 
        <option>@date.ToString("d")</option> 
       } 
      } 
     </select> 
     <button type="submit">Submit</button> 
</form> 

上記のコールこのアクション:

[HttpPost] 
public IActionResult ChooseDate(string selectedDate) 
{ 
    return RedirectToAction("TripManage", new { selectedDate = selectedDate }); 
} 

文字列 "selectedDate"には値があります。私の問題は、AdminManage.cshtmlという別のビューでこの同じアクションを呼び出そうとするときです。選択された文字列はNULLです。私はこのMVCビジネスではかなり新しいので、おそらくそれは私が気づいていない何らかの種類の裏目のモデルバインディングに関連していると思いました。

AdminManage.cshtml

@model TripManagement.Models.AdminManageModel  
<form asp-action="AdminManage" method="post"> 
     <select asp-for="date.selectedDate"> 
      @if (Model.date.listDates.Count == 0) 
      { 
       <option>-</option> 
      } 
      else 
      { 
       foreach (var date in Model.date.listDates) 
       { 
        <option>@date.ToString("d")</option> 
       } 
      } 
     </select> 
     <button type="submit">Submit</button> 
</form> 

(上記ChooseDateと全く同じ)以下のアクションを呼び出します:

[HttpPost] 
public IActionResult AdminManage(string selectedDate) 
{ 
    return RedirectToAction("TripManage", new { selectedDate = selectedDate }); 
} 

を私は同じことを行うには完全に別のアクションを作ってみましたこのアクションでは、selectedDateは常にNULLです。なぜこれが起こっているのか分かりません。どこかに正しくマップできないのですが、これが私の最初のMVCプロジェクトであるため、これをさらにトラブルシューティングする方法はありません。 ChooseDate.cshtmlとAdminManage.cshtmlの2つのビューの違いは、それらが異なるモデルを使用していることですが、モデルのプロパティはここでも機能しますか?

ご協力いただきありがとうございます。

答えて

1

私は問題は、あなたの "asp-for"属性の値を変更することだと思う、あなたのサーバー側の方法を適用せずに。

あなたの最初の例では、2番目のものと異なっている:

<select asp-for="selectedDate"> 
<select asp-for="date.selectedDate"> 

これは、結合モデルが失敗している理由を、あなたのフォームが故に代わりに「selectedDate」の「date.selectedDate」を掲示することを意味します。あなたの応答のための

public IActionResult AdminManage([Bind(Prefix="date")]string selectedDate) 
+0

ありがとう:

はにあなたの "AdminManage" 方法を変更してみてください。私は説明したようにAdminManageメソッドを変更しようとしました。ただし、selectedDateという文字列はまだnullです。 (また、私にはちょうどselectedDateが文字列であり、Datetime型ではなく、両方の形式でasp-forに示されています。デスクトップ開発から来て、自分で変更する型にあまり慣れていません) これ以上のアイデアはありますか? –

+0

もう少しグーグルでグーグルをやった後、selectedDateという文字列の代わりに、関連するモデルを渡す代わりに、両方のアクションが働くようになりました。これはMVCの規則に沿っているように見えますが、私には別のことを教えてください。 MVCはTripDateモデルとselectedDateモデルをバインドする必要がありますが、AdminManageモデルとstring selectedDateモデルは同じではないはずです。 –

関連する問題