0

我正在尝试在我的视图中创建一个 TextBox,我可以使用 Linq 语句进行搜索。

当我尝试从视图中实现搜索时,编译器找不到我的产品列表。

当我尝试从控制器实现它时,它找不到我的搜索框,这两种情况我都理解,但我不明白如何解决问题。或者最好在控制器或视图中实现搜索?

我在代码中做了评论,在那里我尝试了我的搜索功能。

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>
4

3 回答 3

1

这里有几件事。

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);
}
于 2013-08-28T14:24:05.817 回答
1

您通常会将所有需要的数据发送到客户端(例如,作为存储在客户端响应中的 JSON),然后在 JavaScript 中执行过滤客户端。

或者,如果您想在服务器端执行搜索,那么您可以将搜索项发布到服务器、处理并返回视图,或者使用 AJAX 异步执行搜索,可能使用 jQuery 之类的库来制作这更容易。

于 2013-08-28T14:13:52.060 回答
1

您将prods列表作为模型传递给视图,因此您确实拥有它,只是不在相同的变量名下。将此行添加到您的视图中Layout = null;

var prods = Model;

MVC 不像 Web 窗体,您可以从后面的代码中看到控件,并从标记 (aspx) 中看到变量后面的代码。控制器和视图之间有明确的分离,您必须在它们之间显式地传递信息。数据通过模型或更通用的 ViewBag 和 ViewData 集合从控制器传递到视图。数据通过来自多个来源的请求数据从视图传递到控制器;路由值、查询字符串或表单值。

至于在哪里执行搜索,视图应该只包含与组装视图相关的任何视图逻辑。我相信搜索功能肯定不属于该类别,因此它应该在控制器中实现,或者根据严格的关注点分离,在存储库/数据访问层中实现。

于 2013-08-28T14:15:09.620 回答