Asp.net 在使用ViewModel的搜索表单下显示结果列表

Asp.net 在使用ViewModel的搜索表单下显示结果列表,asp.net,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,以下是先前的帖子: 我还尝试了以下搜索示例: …但这并没有像我在上一篇文章的答案中建议的那样使用ViewModel 我正在尝试帮助进行“从”搜索,该搜索需要两个日期(从/到),基于ViewModel: public class SearchViewModel { [Required] public DateTime From { get; set; } [Required] public DateTime To { get; set; } } 我的视图/Sear

以下是先前的帖子:

我还尝试了以下搜索示例:

…但这并没有像我在上一篇文章的答案中建议的那样使用ViewModel

我正在尝试帮助进行“从”搜索,该搜索需要两个日期(从/到),基于ViewModel:

public class SearchViewModel
{
    [Required]
    public DateTime From { get; set; }
    [Required]
    public DateTime To { get; set; }
}
我的视图/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>
} 
到目前为止还不错-我的视图显示了日期默认为今天的文本框(使用DateTime助手)。单击“搜索”时,代码将转到SearchController//Post:/Search,如下所示:

    //
    // 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());

        }
我是在尝试混合苹果和梨吗?是否在“发件人”和“收件人”搜索框(ViewModel)下显示房间列表

谢谢,


标记

您可以返回包含搜索结果的不同视图:

IQueryable<Room> rooms = db.Rooms.Where(r => r.Clients.Any(c => c.Departure >= dteFrom && c.Departure < dteTo));
return View("Result", rooms.ToList());
如果要保留相同的视图,请修改视图模型,使其包含第三个属性,该属性将表示搜索结果(房间集合),您将在POST controller操作中填充该搜索结果,并重新显示相同的视图:

IQueryable<Room> rooms = db.Rooms.Where(r => r.Clients.Any(c => c.Departure >= dteFrom && c.Departure < dteTo));
searchViewModel.Rooms = rooms;
return View(searchViewModel);
但在这两种情况下,我猜
Room
对象都是域模型。良好实践表明,您应该定义一个视图模型,其中仅包含视图所需的信息:

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

然后使用
IEnumerable Rooms{get;set;}
属性。您仍然可以在控制器操作中从DAL层获取
IQueryable
域模型,但在将其传递到视图之前,请确保执行到视图模型的转换。这是可以派上用场的地方。

您可以返回包含搜索结果的不同视图:

IQueryable<Room> rooms = db.Rooms.Where(r => r.Clients.Any(c => c.Departure >= dteFrom && c.Departure < dteTo));
return View("Result", rooms.ToList());
如果要保留相同的视图,请修改视图模型,使其包含第三个属性,该属性将表示搜索结果(房间集合),您将在POST controller操作中填充该搜索结果,并重新显示相同的视图:

IQueryable<Room> rooms = db.Rooms.Where(r => r.Clients.Any(c => c.Departure >= dteFrom && c.Departure < dteTo));
searchViewModel.Rooms = rooms;
return View(searchViewModel);
但在这两种情况下,我猜
Room
对象都是域模型。良好实践表明,您应该定义一个视图模型,其中仅包含视图所需的信息:

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

然后使用
IEnumerable Rooms{get;set;}
属性。您仍然可以在控制器操作中从DAL层获取
IQueryable
域模型,但在将其传递到视图之前,请确保执行到视图模型的转换。这是可以派上用场的地方。

您正在将不同的模型返回到同一个视图中,因此首先只需更改控制器以返回传入的
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
    }
}
@model ttp.Models.SearchViewModel
@{     
ViewBag.Title=“搜索可用性”;
} 
搜索可用性
@使用(Html.BeginForm())
{      
@LabelFor(x=>x.From)
@EditorFor(x=>x.From)
@Html.ValidationMessageFor(x=>x.From)
@LabelFor(x=>x.To)
@EditorFor(x=>x.To)
@Html.ValidationMessageFor(x=>x.To)
搜寻
}
@如果(ViewBag.Rooms!=null)
{
foreach(ViewBag中的var房间。房间作为列表)
{
//在此处创建房间列表标记
}
}

您正在将不同的模型返回到同一个视图,因此首先,只需更改控制器以返回传入的
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
    }
}
@model ttp.Models.SearchViewModel
@{     
ViewBag.Title=“搜索可用性”;
} 
搜索可用性
@使用(Html.BeginForm())
{      
@LabelFor(x=>x.From)
@EditorFor(x=>x.From)
@Html.ValidationMessageFor(x=>x.From)
@LabelFor(x=>x.To)
@EditorFor(x=>x.To)
@Html.ValidationMessageFor(x=>x.To)
搜寻
}
@如果(ViewBag.Rooms!=null)
{
foreach(ViewBag中的var房间。房间作为列表)
{
//在此处创建房间列表标记
}
}

要么你有都灵电脑的帖子,要么你在帮助这里的人方面出奇地多产-要么,我很感激-它帮助了我,更具体地说,帮助了我在这个社区中心努力帮助的人,非常多!我也转达他们的谢意。干杯有没有什么方法可以让搜索表单保持在results.cshtml的顶部?或者是进入partialView区域?是的,你可以,这就是我答案的第二部分所涵盖的内容=>在现有视图模型中添加一个属性,该属性将包含一组房间,并在视图内测试该属性是否已定义。要么你有都灵计算机的帖子,要么你在帮助这里的人方面表现出惊人的丰富性-要么/或者,我很感激-它在帮助我,更具体地说,我在这个社区中心努力帮助的人,非常多!我也转达他们的谢意。干杯有没有办法让搜索表单保持在results.cshtml的顶部?或者是进入PartialViews区域?是的,你可以,这就是我回答的第二部分所涵盖的=>向现有视图模型添加一个属性,该属性将包含一个房间集合,并在视图内测试是否定义了该属性。