在视图中使用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>

在视图中使用Linq进行搜索

您将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);
}