1

以前の投稿に続く:DateTimeテンプレートを使用した検索フォームの追加

また、ここで検索の例に従ってみました:http ://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/sorting-filtering-and-paging-with-the-entity-framework -in-an-asp-net-mvc-application

...しかし、それは私の以前の投稿への回答で示唆されているようにViewModelを利用していません。

私は、次のViewModelに基づいて、2つの日付(from / to)をとるfromの検索を支援しようとしています。

public class SearchViewModel
{
    [Required]
    public DateTime From { get; set; }
    [Required]
    public DateTime To { get; set; }
}

私のViews/Search/Index.cshtmlは次のとおりです。

@model ttp.Models.SearchViewModel
@{
    ViewBag.Title = "Search Availability";
}
<h2>Search Availability</h2>
@using (Html.BeginForm()) 
{ 
    <div class="row">
        <div class="span2">@Html.LabelFor(x => x.From)</div>
        <div class="span2">@Html.EditorFor(x => x.From)</div>
        <div class="span2">@Html.ValidationMessageFor(x => x.From)</div>
        </div>

    <div class="row">
        <div class="span2">@Html.LabelFor(x => x.To)</div>
        <div class="span2">@Html.EditorFor(x => x.To)</div>
        <div class="span2">@Html.ValidationMessageFor(x => x.To)</div>
    </div>

     <div class="row">
        <div class="span2 offset2"><button type="submit">Search</button></div>
     </div>
} 

Get:/ Search/Indexコントローラーは次のとおりです。

    //
    // GET: /Search/

    public ActionResult Index()
    {
        SearchViewModel svm = new SearchViewModel();
        svm.From = DateTime.Today;
        svm.To = DateTime.Today;
        return View(svm);
    }

これまでのところ良好です-私のビューには、日付がデフォルトで今日になっているテキストボックスが表示されます(DateTimeヘルパーを使用)。[検索]をクリックすると、コードはSearchControllerに移動します//投稿:/次のように検索します:

    //
    // Post: /Search/
    [HttpPost]
    public ActionResult Index(SearchViewModel searchViewModel)
    {
        if (!ModelState.IsValid)
        {
            // Not valid, so just return the search boxes again
            return View(searchViewModel);
        }

        // Get the From/To of the searchViewModel

        DateTime dteFrom = searchViewModel.From;
        DateTime dteto = searchViewModel.To;

        // Query the database using the posted from/to dates

        IQueryable<Room> rooms = db.Rooms.Where(r => r.Clients.Any(c => c.Departure >= dteFrom && c.Departure < dteTo));

        // This is where I'm unsure

        ViewBag.Rooms = rooms.ToList();
        return View(rooms.ToList());

        }

現時点でわからないのは、Postコントローラーの最後の数行(IQueryableルームの部屋のリストを返す方法)と画面に部屋のリストを表示する方法です。別のビューにリダイレクトしますか(その場合、部屋のリストをそのビューに渡すにはどうすればよいですか)?上記のコードを実行しようとすると、次のエラーが発生します。

The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[ttp.Models.Room]', but this dictionary requires a model item of type 'ttp.Models.SearchViewModel'.

リンゴとナシを混ぜようとしていますか?とにかく、From and To検索ボックス(ViewModel)の下に部屋のリストを表示する方法はありますか?

ありがとうございました、

マーク

4

2 に答える 2

4

検索結果を含む別のビューを返すことができます。

IQueryable<Room> rooms = db.Rooms.Where(r => r.Clients.Any(c => c.Departure >= dteFrom && c.Departure < dteTo));
return View("Result", rooms.ToList());

そして内部Result.cshtml

@model IEnumerable<Room>
... show the rooms here

同じビューを維持したくない場合は、ビュー モデルを変更して、POST コントローラー アクション内に入力し、同じビューを再表示する検索結果 (部屋のコレクション) を表す 3 番目のプロパティが含まれるようにします。

IQueryable<Room> rooms = db.Rooms.Where(r => r.Clients.Any(c => c.Departure >= dteFrom && c.Departure < dteTo));
searchViewModel.Rooms = rooms;
return View(searchViewModel);

次に、ビュー内に結果を表示するセクションを含めることができます。

@if (Model.Rooms != null)
{
    ... display the search results here
}

Roomしかし、どちらの場合も、オブジェクトはドメイン モデルだと思います。ビューに必要な情報のみを含むビュー モデルを定義することをお勧めします。

public class RoomViewModel
{
    ... only properties that you need to work with on the view
}

そして、操作するIEnumerable<RoomViewModel> Rooms { get; set; }プロパティがあります。DAL レイヤーからコントローラー アクションでドメイン モデルをフェッチすることもできますIQueryable<Room>が、ビューに渡す前に、必ずビュー モデルへの変換を実行してください。そこでAutoMapperが役に立ちます。

于 2012-07-02T12:33:26.437 に答える
1

異なるモデルを同じビューに返すため、最初はコントローラーを変更して、渡された を返すようにしsearchViewModelます。

ViewBag.Rooms = rooms.ToList();
return View(searchViewModel);

ViewBag で行ったように、部屋のリストを同じビューに戻すこともできます。リストのマークアップをレンダリングしているビューのどこにもありません。

@model ttp.Models.SearchViewModel 
@{     
    ViewBag.Title = "Search Availability"; 
} 
<h2>Search Availability</h2> 
@using (Html.BeginForm())  
{      
    <div class="row">
        <div class="span2">@Html.LabelFor(x => x.From)</div>
        <div class="span2">@Html.EditorFor(x => x.From)</div>
        <div class="span2">@Html.ValidationMessageFor(x => x.From)</div>
    </div>
    <div class="row">
        <div class="span2">@Html.LabelFor(x => x.To)</div>
        <div class="span2">@Html.EditorFor(x => x.To)</div>
        <div class="span2">@Html.ValidationMessageFor(x => x.To)</div>
    </div>
    <div class="row">
        <div class="span2 offset2"><button type="submit">Search</button></div>
    </div> 
}
@if (ViewBag.Rooms != null)
{
    foreach (var room in ViewBag.Rooms as List<Room>)
    {
        // Build your room list markup here
    }
}
于 2012-07-02T12:41:04.087 に答える