2013-08-28 2 views
0

Linak 문을 사용하여 검색 할 수있는 TextBox를 내보기에 만들려고합니다.보기에서 Linq를 사용하여 검색

보기에서 검색을 구현하려고하면 컴파일러에서 내 prods 목록을 찾을 수 없습니다.

컨트롤러에서 구현하려고하면 내 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> 
+0

코드에서'prods' 목록을 사용하여이 쿼리가 나는 것 같아요 문제는 두 번째입니까? 'prods'리스트를'Index()'메소드 밖에서 선언해야한다. –

답변

1

prods 목록을 모델로보기에 전달하면 동일한 변수 이름 아래에 있지 않게됩니다. Layout = null;에서보기에이 줄을 추가 : 뒤에 코드에서 컨트롤을 확인하고 마크 업 (영문)에서 변수 뒤에 코드를 볼 수있는

var prods = Model; 

MVC는 웹 양식처럼되지 않습니다. 컨트롤러와 뷰 사이에는 명확한 구분이 있으므로 명시 적으로 정보를 전달해야합니다. 모델 또는보다 일반적인 ViewBag 및 ViewData 컬렉션을 통해 컨트롤러에서 뷰로 데이터가 전달됩니다. 여러 소스에서 올 수있는 요청 데이터를 통해 뷰에서 컨트롤러로 데이터가 전달됩니다. 경로 값, 쿼리 문자열 또는 양식 값.

검색을 수행 할 위치에 따라보기에는보기를 구성하는 데 관련된보기 논리 만 포함해야합니다. 필자는 검색 기능이 해당 범주를 벗어나는 경우가 대부분이므로 컨트롤러에 구현해야하거나 엄격한 관심사에 따라 저장소/데이터 액세스 계층에 구현해야한다고 생각합니다.

1

는 정상적으로 어느 클라이언트 (예컨대 JSON으로 클라이언트에 응답하여 저장)하고 자바 스크립트 필터링 클라이언트 측을 수행하는 데 필요한 모든 데이터를 보낼 것이다.

또는 서버 측에서 검색을 수행하려는 경우 서버에 검색 용어를 게시하고 처리 한 다음 AJAX와 비동기 적으로 검색을 수행 할 수 있습니다. jQuery를 사용하면이 작업을 더 쉽게 수행 할 수 있습니다.

1

여기 몇 가지가 있습니다.

prods은 컨트롤러에서보기로 전달하는 변수 이름이 같지 않으므로 Razor보기에서 정의되지 않았습니다. 따라서 컨트롤러에 return View(prods)을 사용하고 있어도 prods 변수는 사용자의보기에 존재하지 않습니다. 변수 Model은 실제로 prods 개체가 될 것으로 기대하는 것입니다. 당신이 면도기에 직접 입력 값을 읽을 수 없기 때문에

prods이보기에 정의 된 경우에도 LINQ 쿼리는 여전히 작동하지 않을 것입니다. 예 :

<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); 
} 
+0

고마워요. 매우 편리 해요^_ ^! –

관련 문제