在视图中使用Linq进行搜索
本文关键字:搜索 Linq 视图 | 更新日期: 2023-09-27 18:29:16
我正在尝试在我的视图中创建一个TextBox,我可以使用Linq语句进行搜索。
当我尝试从视图中实现搜索时,编译器找不到我的prods List。
当我尝试从控制器实现它时,它找不到我的searchBox,在这两种情况下我都能理解,但我不知道如何解决问题。或者是否最好在控制器或视图中执行搜索??
我在代码中做了评论,我在那里尝试了我的搜索功能。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Uppgift_1.Models;
namespace Uppgift_1.Controllers
{
public class ProductController : Controller
{
public ActionResult Index()
{
List<MyProduct> prods = new List<MyProduct>()
{
.....add Products......
};
// Linq search
var searchResults = (from s in prods where(s.ProductName == searchBox || s.ProductId == searchBox) select s).ToList();
return View(prods);
}
}
}
@model IEnumerable<Uppgift_1.Models.MyProduct>
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
@foreach (var x in Model)
{
<div>
<h3>@x.ProductName</h3>
Article# @x.ProductId
<h4>@x.PriceSell.ToString("c")</h4>
</div><hr />
}
<div>
<input type="text" name="searchBox" />
// Link search
@{
var searchResults = (from s in prods where (s.ProductName == searchBox || s.ProductId == searchBox)
select s).ToList();
}
</div>
</body>
</html>
您将prods
列表作为Model传递给视图,因此它不在同一变量名下。将此行添加到Layout = null;
:下的视图中
var prods = Model;
MVC与Web窗体不同,在Web窗体中,您可以从代码隐藏中查看控件,也可以从标记(aspx)中查看代码隐藏变量。控制器和视图之间有明显的分隔,您必须在它们之间明确地传递信息。数据通过Model或更通用的ViewBag和ViewData集合从控制器传递到视图。数据通过请求数据从视图传递到控制器,请求数据可以来自多个来源;路由值、查询字符串或表单值。
至于在哪里执行搜索,视图应该只包含与组装视图相关的视图逻辑。我相信搜索功能肯定不属于这一类别,因此它应该在控制器中实现,或者根据严格的关注点分离,在存储库/数据访问层中实现。
您通常会将所有所需的数据发送到客户端(例如,作为存储在客户端响应上的JSON),然后用JavaScript执行过滤客户端。
或者,如果您想在服务器端执行搜索,那么您可以将搜索词发布到服务器,处理并返回视图,或者使用AJAX异步执行搜索,也许可以使用jQuery等库来简化搜索。
这里有一些内容。
prods
在Razor视图中是未定义的,因为从控制器传递到视图中的变量名不相同。因此,即使在控制器中使用return View(prods)
,视图中也不会存在变量prods
。变量Model
实际上就是您所期望的prods
对象
即使在视图中定义了prods
,您的Linq查询仍然无法工作,因为您无法直接在Razor中读取输入值。例如:
<input type="text" name="searchQuery" />
@{
var query = searchQuery;
//searchModel isn't a variable, it's just the name you gave to your HTML input.
}
为了读取该值,您需要向控制器发回一个请求。您需要通过提交表单或向控制器发送AJAX请求来实现这一点。一旦您的控制器收到该请求,该就是您的linq查询所在地,或者可能在您的模型中,这取决于程序的体系结构。一个非常基本的例子是这样的:
<form method="post" action="/yourcontroller/search">
<input type="text" name="searchQuery" />
<input type="submit" value="Search" />
</form>
然后你的控制器动作会是这样的:
public ActionResult Search(string searchQuery)
{
var results = (from x in YourCollection where x.Field == searchQuery select x).ToList();
return View(results);
}