2012-07-02 61 views
1

從先前的帖子下面就結果的列表:Adding a search form using a DateTime template顯示在搜索表單,它使用一個ViewModel

我也試過以下搜索例子在這裏: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。

我想,以幫助從搜索,這將需要兩個日期(自/至)的基礎上,一個視圖模型:

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

我瀏覽/搜索/ 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/ 

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

到目前爲止好 - 我的視圖顯示與d文本框ates默認爲今天(使用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()); 

     } 

我在哪裏,現在不能確定是近一郵政控制器的線 - 我該如何返回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'. 

我豈是混合蘋果和梨 - 反正是有顯示在從和在搜索框的房間列表(視圖模型) ?

謝謝

馬克

回答

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控制器的動作裏面填充,並重新顯示了同樣的觀點:

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可以派上用場的地方。

+1

要麼你有一個TURIN電腦發佈給你,或者你是驚人地多產於幫助這裏的人 - 或者,我很感激 - 它幫助我,更具體地說,我試圖幫助這個社區的人中心,非常多!我也傳遞他們的感謝。乾杯! – Mark

+0

有沒有什麼辦法可以將搜索表單保留在results.cshtml的頂部 - 或者是進入PartialViews的區域嗎? – Mark

+0

是的,您可以,這就是我的答案的第二部分涵蓋的內容=>將屬性添加到現有視圖模型中,該模型將包含房間集合並在視圖內測試此屬性是否已定義。 –

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 
    } 
} 
相關問題