편집 메서드 및 편집 보기 검사(VB)Examining the Edit Methods and Edit View (VB)

Rick Andersonby Rick Anderson

이 자습서에서는 Microsoft Visual Studio의 무료 버전인 Microsoft Visual Web Developer 2010 Express 서비스 팩 1을 사용 하 여 ASP.NET MVC 웹 응용 프로그램을 빌드하는 기본 사항을 학습 합니다.This tutorial will teach you the basics of building an ASP.NET MVC Web application using Microsoft Visual Web Developer 2010 Express Service Pack 1, which is a free version of Microsoft Visual Studio. 시작 하기 전에 아래 나열 된 필수 구성 요소를 설치 했는지 확인 합니다.Before you start, make sure you've installed the prerequisites listed below. 웹 플랫폼 설치 관리자링크를 클릭 하 여 모든 항목을 설치할 수 있습니다.You can install all of them by clicking the following link: Web Platform Installer. 또는 다음 링크를 사용 하 여 필수 구성 요소를 개별적으로 설치할 수 있습니다.Alternatively, you can individually install the prerequisites using the following links:

Visual Web Developer 2010 대신 Visual Studio 2010을 사용 하는 경우 Visual studio 2010 필수 조건링크를 클릭 하 여 필수 구성 요소를 설치 합니다.If you're using Visual Studio 2010 instead of Visual Web Developer 2010, install the prerequisites by clicking the following link: Visual Studio 2010 prerequisites.

VB.NET 소스 코드를 사용 하는 Visual Web Developer 프로젝트를이 항목과 함께 사용할 수 있습니다.A Visual Web Developer project with VB.NET source code is available to accompany this topic. VB.NET 버전을 다운로드합니다.Download the VB.NET version. C #을 선호 하는 경우이 자습서의 c # 버전 으로 전환 합니다.If you prefer C#, switch to the C# version of this tutorial.

이 섹션에서는 동영상 컨트롤러에 대해 생성 된 작업 메서드 및 뷰를 검사 합니다.In this section, you'll examine the generated action methods and views for the movie controller. 그런 다음 사용자 지정 검색 페이지를 추가 합니다.Then you'll add a custom search page.

응용 프로그램을 실행 하 고 Movies 브라우저의 주소 표시줄에 있는 URL에 /sourcea 를 추가 하 여 컨트롤러를 찾습니다.Run the application and browse to the Movies controller by appending /Movies to the URL in the address bar of your browser. 편집 링크 위에 마우스 포인터를 놓으면 링크 되는 URL을 볼 수 있습니다.Hold the mouse pointer over an Edit link to see the URL that it links to.

EditLink_sm

Views\Movies\Index.vbhtml 뷰의 메서드에서 편집 링크를 생성 했습니다 Html.ActionLink . Views\Movies\Index.vbhtmlThe Edit link was generated by the Html.ActionLink method in the Views\Movies\Index.vbhtml view:

@Html.ActionLink("Edit", "Edit", New With {.id = currentItem.ID}) |

EditLink_smEditLink_sm

Html개체는 기본 클래스의 속성을 사용 하 여 노출 되는 도우미입니다 WebViewPage .The Html object is a helper that's exposed using a property on the WebViewPage base class. ActionLink도우미의 메서드를 사용 하면 컨트롤러에서 작업 메서드에 연결 되는 HTML 하이퍼링크를 쉽게 동적으로 생성할 수 있습니다.The ActionLink method of the helper makes it easy to dynamically generate HTML hyperlinks that link to action methods on controllers. 메서드의 첫 번째 인수는 ActionLink 렌더링할 링크 텍스트입니다 (예: <a>Edit Me</a> ).The first argument to the ActionLink method is the link text to render (for example, <a>Edit Me</a>). 두 번째 인수는 호출할 동작 메서드의 이름입니다.The second argument is the name of the action method to invoke. 마지막 인수는 경로 데이터를 생성 하는 익명 개체 입니다 (이 경우 ID 4).The final argument is an anonymous object that generates the route data (in this case, the ID of 4).

이전 이미지에 표시 된 링크는 http://localhost:xxxxx/Movies/Edit/4 입니다.The generated link shown in the previous image is http://localhost:xxxxx/Movies/Edit/4. 기본 경로는 URL 패턴을 사용 합니다 {controller}/{action}/{id} .The default route takes the URL pattern {controller}/{action}/{id}. 따라서 ASP.NET는 http://localhost:xxxxx/Movies/Edit/4 Edit Movies 매개 변수가 4 인 컨트롤러의 작업 메서드에 대 한 요청으로 변환 됩니다 ID .Therefore, ASP.NET translates http://localhost:xxxxx/Movies/Edit/4 into a request to the Edit action method of the Movies controller with the parameter ID equal to 4.

쿼리 문자열을 사용 하 여 동작 메서드 매개 변수를 전달할 수도 있습니다.You can also pass action method parameters using a query string. 예를 들어 URL은 http://localhost:xxxxx/Movies/Edit?ID=4 매개 변수 4를 ID Edit 컨트롤러의 동작 메서드에 전달 합니다 Movies .For example, the URL http://localhost:xxxxx/Movies/Edit?ID=4 also passes the parameter ID of 4 to the Edit action method of the Movies controller.

EditQueryStringEditQueryString

컨트롤러를 엽니다 Movies .Open the Movies controller. Edit 작업 메서드는 다음과 같습니다.The two Edit action methods are shown below.

'
' GET: /Movies/Edit/5

Function Edit(id As Integer) As ViewResult
    Dim movie As Movie = db.Movies.Find(id)
    Return View(movie)
End Function

'
' POST: /Movies/Edit/5

<HttpPost()>
Function Edit(movie As Movie) As ActionResult
    If ModelState.IsValid Then
        db.Entry(movie).State = EntityState.Modified
        db.SaveChanges()
        Return RedirectToAction("Index")
    End If

    Return View(movie)
End Function

두 번째 Edit 작업 메서드 앞에 HttpPost 특성이 지정되어 있는 것에 유의하세요.Notice the second Edit action method is preceded by the HttpPost attribute. 이 특성은 Edit POST 요청에 대해서만 메서드의 오버 로드를 호출할 수 있도록 지정 합니다.This attribute specifies that overload of the Edit method can be invoked only for POST requests. HttpGet특성을 첫 번째 edit 메서드에 적용할 수 있지만 이것이 기본값 이기 때문에 필요 하지 않습니다.You could apply the HttpGet attribute to the first edit method, but that's not necessary because it's the default. (특성을 메서드로 명시적으로 할당 하는 작업 메서드를 참조 HttpGet HttpGet 합니다.)(We'll refer to action methods that are implicitly assigned the HttpGet attribute as HttpGet methods.)

HttpGet Edit 메서드는 movie ID 매개 변수를 사용 하 고, Entity Framework 메서드를 사용 하 여 동영상을 조회 하 Find 고, 선택 된 동영상을 편집 보기로 반환 합니다.The HttpGet Edit method takes the movie ID parameter, looks up the movie using the Entity Framework Find method, and returns the selected movie to the Edit view. 스캐폴딩 시스템은 Edit 보기를 만들 때 Movie 클래스를 검토하고 클래스의 각 속성에 대해 <label><input> 요소를 렌더링하기 위한 코드를 만들었습니다.When the scaffolding system created the Edit view, it examined the Movie class and created code to render <label> and <input> elements for each property of the class. 다음 예에서는 생성 된 편집 뷰를 보여 줍니다.The following example shows the Edit view that was generated:

@ModelType MvcMovie.Movie

@Code
    ViewData("Title") = "Edit"
End Code

<h2>Edit</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@Using Html.BeginForm()
    @Html.ValidationSummary(True)
    @<fieldset>
        <legend>Movie</legend>

        @Html.HiddenFor(Function(model) model.ID)

        <div class="editor-label">
            @Html.LabelFor(Function(model) model.Title)
        </div>
        <div class="editor-field">
            @Html.EditorFor(Function(model) model.Title)
            @Html.ValidationMessageFor(Function(model) model.Title)
        </div>

        <div class="editor-label">
            @Html.LabelFor(Function(model) model.ReleaseDate)
        </div>
        <div class="editor-field">
            @Html.EditorFor(Function(model) model.ReleaseDate)
            @Html.ValidationMessageFor(Function(model) model.ReleaseDate)
        </div>

        <div class="editor-label">
            @Html.LabelFor(Function(model) model.Genre)
        </div>
        <div class="editor-field">
            @Html.EditorFor(Function(model) model.Genre)
            @Html.ValidationMessageFor(Function(model) model.Genre)
        </div>

        <div class="editor-label">
            @Html.LabelFor(Function(model) model.Price)
        </div>
        <div class="editor-field">
            @Html.EditorFor(Function(model) model.Price)
            @Html.ValidationMessageFor(Function(model) model.Price)
        </div>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
End Using

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

뷰 템플릿에는 @ModelType MvcMovie.Models.Movie 파일 위쪽에 문이 포함 되어 있습니다 .이는 뷰에서 뷰 템플릿의 모델을 형식으로 예상 하도록 지정 합니다 Movie .Notice how the view template has a @ModelType MvcMovie.Models.Movie statement at the top of the file — this specifies that the view expects the model for the view template to be of type Movie.

스 캐 폴드 코드는 몇 가지 도우미 메서드 를 사용 하 여 HTML 태그를 간소화 합니다.The scaffolded code uses several helper methods to streamline the HTML markup. Html.LabelFor도우미는 필드 이름 ( " 제목 " , " releasedate " , " 장르 " 또는 " Price " )을 표시 합니다.The Html.LabelFor helper displays the name of the field ("Title", "ReleaseDate", "Genre", or "Price"). Html.EditorFor도우미는 HTML 요소를 표시 합니다 <input> .The Html.EditorFor helper displays an HTML <input> element. Html.ValidationMessageFor도우미는 해당 속성과 연결 된 유효성 검사 메시지를 표시 합니다.The Html.ValidationMessageFor helper displays any validation messages associated with that property.

응용 프로그램을 실행 하 고 /영화 URL로 이동 합니다.Run the application and navigate to the /Movies URL. Edit 링크를 클릭합니다.Click an Edit link. 브라우저에서 페이지의 소스를 봅니다.In the browser, view the source for the page. 페이지의 HTML은 다음 예제와 같습니다.The HTML in the page looks like the following example. 메뉴 태그는 명확 하 게 하기 위해 제외 되었습니다.(The menu markup was excluded for clarity.)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Edit</title>
    <link href="/Content/Site.css" rel="stylesheet" type="text/css" />
    <script src="/Scripts/jquery-1.5.1.min.js" type="text/javascript"></script>
    <script src="/Scripts/modernizr-1.7.min.js" type="text/javascript"></script>
</head>
<body>
    <div class="page">
        <header>
            <div id="title">
                <h1>MVC Movie App</h1>
            </div>
           ...
        </header>
        <section id="main">

<h2>Edit</h2>

<script src="/Scripts/jquery.validate.min.js" type="text/javascript"></script>
<script src="/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>

<form action="/Movies/Edit/4" method="post">    <fieldset>
        <legend>Movie</legend>

        <input data-val="true" data-val-number="The field ID must be a number." 
    data-val-required="The ID field is required." id="ID" name="ID" type="hidden" value="4" />

        <div class="editor-label">
            <label for="Title">Title</label>
        </div>
        <div class="editor-field">
            <input class="text-box single-line" id="Title" name="Title" type="text" value="Rio Bravo" />
            <span class="field-validation-valid" data-valmsg-for="Title" data-valmsg-replace="true"></span>
        </div>

        <div class="editor-label">
            <label for="ReleaseDate">ReleaseDate</label>
        </div>
        <div class="editor-field">
            <input class="text-box single-line" data-val="true" data-val-required="The ReleaseDate field is required." 
    id="ReleaseDate" name="ReleaseDate" type="text" value="4/15/1959 12:00:00 AM" />
            <span class="field-validation-valid" data-valmsg-for="ReleaseDate" data-valmsg-replace="true"></span>
        </div>

        <div class="editor-label">
            <label for="Genre">Genre</label>
        </div>
        <div class="editor-field">
            <input class="text-box single-line" id="Genre" name="Genre" type="text" value="Western" />
            <span class="field-validation-valid" data-valmsg-for="Genre" data-valmsg-replace="true"></span>
        </div>

        <div class="editor-label">
            <label for="Price">Price</label>
        </div>
        <div class="editor-field">
            <input class="text-box single-line" data-val="true" data-val-number="The field Price must be a number." 
    data-val-required="The Price field is required." id="Price" name="Price" type="text" value="9.99" />
            <span class="field-validation-valid" data-valmsg-for="Price" data-valmsg-replace="true"></span>
        </div>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
</form>
<div>
    <a href="/Movies">Back to List</a>
</div>

        </section>
        <footer>
        </footer>
    </div>
</body>
</html>

<input>요소는 <form> action /Movies/Edit URL에 post로 설정 된 특성이 있는 HTML 요소에 있습니다.The <input> elements are in an HTML <form> element whose action attribute is set to post to the /Movies/Edit URL. 편집 단추를 클릭 하면 폼 데이터가 서버에 게시 됩니다.The form data will be posted to the server when the Edit button is clicked.

POST 요청 처리Processing the POST Request

다음 목록은 Edit 작업 메서드의 HttpPost 버전을 보여줍니다.The following listing shows the HttpPost version of the Edit action method.

'
' POST: /Movies/Edit/5

<HttpPost()>
Function Edit(movie As Movie) As ActionResult
    If ModelState.IsValid Then
        db.Entry(movie).State = EntityState.Modified
        db.SaveChanges()
        Return RedirectToAction("Index")
    End If

    Return View(movie)
End Function

ASP.NET framework 모델 바인더는 게시 된 양식 값을 사용 하 고 Movie 매개 변수로 전달 되는 개체를 만듭니다 movie .The ASP.NET framework model binder takes the posted form values and creates a Movie object that's passed as the movie parameter. ModelState.IsValid코드를 체크 인하면 폼에 전송 된 데이터를 사용 하 여 개체를 수정할 수 있는지 확인 합니다 Movie .The ModelState.IsValid check in the code verifies that the data submitted in the form can be used to modify a Movie object. 데이터가 유효한 경우 코드는 동영상 데이터를 인스턴스의 컬렉션에 저장 합니다 Movies MovieDBContext .If the data is valid, the code saves the movie data to the Movies collection of the MovieDBContext instance. 그런 다음 코드는 데이터베이스에 대 한 SaveChanges 변경 내용을 유지 하는의 메서드를 호출 하 여 새 동영상 데이터를 데이터베이스에 저장 합니다 MovieDBContext .The code then saves the new movie data to the database by calling the SaveChanges method of MovieDBContext, which persists changes to the database. 데이터를 저장 한 후 코드는 사용자를 Index 클래스의 작업 메서드로 리디렉션하고이로 MoviesController 인해 업데이트 된 동영상이 동영상 목록에 표시 됩니다.After saving the data, the code redirects the user to the Index action method of the MoviesController class, which causes the updated movie to be displayed in the listing of movies.

게시 된 값이 유효 하지 않으면 폼으로 다시 표시 됩니다.If the posted values aren't valid, they are redisplayed in the form. Html.ValidationMessageFor 편집. vbhtml 뷰 템플릿의 도우미는 적절 한 오류 메시지를 표시 합니다.The Html.ValidationMessageFor helpers in the Edit.vbhtml view template take care of displaying appropriate error messages.

abcNotValidabcNotValid

로캘에 대 한 참고 사항 일반적으로 영어가 아닌 로캘로 작업 하는 경우 영어가 아닌 로캘로 ASP.NET MVC 3 유효성 검사 지원 을 참조 하세요.Note about locales If you normally work with a locale other than English, see Supporting ASP.NET MVC 3 Validation with Non-English Locales.

Edit 메서드를 보다 강력 하 게 만들기Making the Edit Method More Robust

HttpGet Edit 스 캐 폴딩 시스템에서 생성 된 메서드는 전달 된 ID가 유효한 지 확인 하지 않습니다.The HttpGet Edit method generated by the scaffolding system doesn't check that the ID that's passed to it is valid. 사용자가 URL ()에서 ID 세그먼트를 제거 하면 http://localhost:xxxxx/Movies/Edit 다음과 같은 오류가 표시 됩니다.If a user removes the ID segment from the URL (http://localhost:xxxxx/Movies/Edit), the following error is displayed:

Null_IDNull_ID

사용자가 데이터베이스에 없는 ID (예:)를 전달할 수도 있습니다 http://localhost:xxxxx/Movies/Edit/1234 .A user could also pass an ID that doesn't exist in the database, such as http://localhost:xxxxx/Movies/Edit/1234. HttpGet Edit 작업 메서드를 변경 하 여 이러한 제한을 해결할 수 있습니다.You can make two changes to the HttpGet Edit action method to address this limitation. 먼저 ID ID가 명시적으로 전달 되지 않는 경우 매개 변수를 기본값인 0으로 변경 합니다.First, change the ID parameter to have a default value of zero when an ID isn't explicitly passed. 또한 Find 동영상 개체를 뷰 템플릿에 반환 하기 전에 메서드가 실제로 영화를 검색 했는지 확인할 수 있습니다.You can also check that the Find method actually found a movie before returning the movie object to the view template. 업데이트 된 Edit 메서드는 다음과 같습니다.The updated Edit method is shown below.

Public Function Edit(Optional ByVal id As Integer = 0) As ActionResult
    Dim movie As Movie = db.Movies.Find(id)
    If movie Is Nothing Then
        Return HttpNotFound()
    End If
    Return View(movie)
End Function

동영상이 없으면 HttpNotFound 메서드가 호출 됩니다.If no movie is found, the HttpNotFound method is called.

모든 HttpGet 메서드는 비슷한 패턴을 따릅니다.All the HttpGet methods follow a similar pattern. 동영상 개체 (또는의 경우 개체 목록)를 가져오고 Index 모델을 뷰에 전달 합니다.They get a movie object (or list of objects, in the case of Index), and pass the model to the view. Create메서드는 빈 동영상 개체를 만들기 뷰에 전달 합니다.The Create method passes an empty movie object to the Create view. 생성, 편집, 삭제 또는 어떤 식으로든 데이터를 수정하는 모든 메서드는 메서드의 HttpPost 오버로드에서 해당 작업을 수행합니다.All the methods that create, edit, delete, or otherwise modify data do so in the HttpPost overload of the method. HTTP GET 메서드에서 데이터를 수정 하는 것은 ASP.NET MVC 팁 #46의 블로그 게시물 항목에 설명 된 것 처럼 보안 위험입니다. 보안 허점을 만들기 때문에 삭제 링크를 사용 하지 마세요.Modifying data in an HTTP GET method is a security risk, as described in the blog post entry ASP.NET MVC Tip #46 – Don't use Delete Links because they create Security Holes. GET 메서드에서 데이터를 수정 하면 HTTP 모범 사례와 구조적 REST 패턴이 위반 되어 GET 요청이 응용 프로그램의 상태를 변경 하지 않도록 지정 합니다.Modifying data in a GET method also violates HTTP best practices and the architectural REST pattern, which specifies that GET requests should not change the state of your application. 즉, GET 작업을 수행 하는 것은 부작용이 없는 안전한 작업 이어야 합니다.In other words, performing a GET operation should be a safe operation that has no side effects.

검색 방법 및 검색 보기 추가Adding a Search Method and Search View

이 섹션에서는 SearchIndex 장르 또는 이름을 기준으로 영화를 검색할 수 있는 작업 메서드를 추가 합니다.In this section you'll add a SearchIndex action method that lets you search movies by genre or name. /Movies/SearchIndex URL을 사용 하 여이를 사용할 수 있습니다.This will be available using the /Movies/SearchIndex URL. 이 요청은 사용자가 영화를 검색 하기 위해 채울 수 있는 입력 요소를 포함 하는 HTML 폼을 표시 합니다.The request will display an HTML form that contains input elements that a user can fill in in order to search for a movie. 사용자가 폼을 제출 하면 동작 메서드가 사용자가 게시 한 검색 값을 가져오고이 값을 사용 하 여 데이터베이스를 검색 합니다.When a user submits the form, the action method will get the search values posted by the user and use the values to search the database.

SearchIndx_SM

SearchIndex 폼 표시Displaying the SearchIndex Form

SearchIndex기존 클래스에 작업 메서드를 추가 하 여 시작 MoviesController 합니다.Start by adding a SearchIndex action method to the existing MoviesController class. 메서드는 HTML 폼이 포함 된 뷰를 반환 합니다.The method will return a view that contains an HTML form. 코드는 다음과 같습니다.Here's the code:

Public Function SearchIndex(ByVal searchString As String) As ActionResult
    Dim movies = From m In db.Movies
                 Select m 

    If Not String.IsNullOrEmpty(searchString) Then 
        movies = movies.Where(Function(s) s.Title.Contains(searchString)) 
    End If
    Return View(movies) 
End Function

메서드의 첫 번째 줄에서는 SearchIndex 다음 LINQ 쿼리를 만들어 영화를 선택 합니다.The first line of the SearchIndex method creates the following LINQ query to select the movies:

Dim movies = From m In db.Movies    Select m

쿼리가이 시점에 정의 되었지만 데이터 저장소에 대해 아직 실행 되지 않았습니다.The query is defined at this point, but hasn't yet been run against the data store.

searchString매개 변수에 문자열이 포함 된 경우 다음 코드를 사용 하 여 검색 문자열의 값을 필터링 하도록 동영상 쿼리를 수정 합니다.If the searchString parameter contains a string, the movies query is modified to filter on the value of the search string, using the following code:

IsNullOrEmpty (searchString)가 아닌 경우If Not String.IsNullOrEmpty(searchString) Then
영화 = 영화. Where (함수 (s) s. Title. Contains (searchString))movies = movies.Where(Function(s) s.Title.Contains(searchString))
종료 인 경우End If

LINQ 쿼리는 정의 될 때 또는 또는와 같은 메서드를 호출 하 여 수정 될 때 실행 되지 Where 않습니다 OrderBy .LINQ queries are not executed when they are defined or when they are modified by calling a method such as Where or OrderBy. 대신 쿼리 실행이 지연 됩니다. 즉, 실현 된 값이 실제로 반복 되거나 메서드가 호출 될 때까지 식의 계산이 지연 됩니다 ToList .Instead, query execution is deferred, which means that the evaluation of an expression is delayed until its realized value is actually iterated over or the ToList method is called. SearchIndex이 샘플에서는 SearchIndex 뷰에서 쿼리가 실행 됩니다.In the SearchIndex sample, the query is executed in the SearchIndex view. 지연된 쿼리 실행에 대한 자세한 내용은 쿼리 실행을 참조하세요.For more information about deferred query execution, see Query Execution.

이제 SearchIndex 사용자에 게 폼을 표시 하는 뷰를 구현할 수 있습니다.Now you can implement the SearchIndex view that will display the form to the user. 메서드 내부를 마우스 오른쪽 단추로 클릭 한 SearchIndex 다음 뷰 추가를 클릭 합니다.Right-click inside the SearchIndex method and then click Add View. 보기 추가 대화 상자에서 Movie 개체를 뷰 템플릿에 모델 클래스로 전달 하도록 지정 합니다.In the Add View dialog box, specify that you're going to pass a Movie object to the view template as its model class. 스 캐 폴드 템플릿 목록에서 목록을 선택한 다음 추가를 클릭 합니다.In the Scaffold template list, choose List, then click Add.

AddSearchViewAddSearchView

추가 단추를 클릭 하면 Views\Movies\SearchIndex.vbhtml view 템플릿이 만들어집니다.When you click the Add button, the Views\Movies\SearchIndex.vbhtml view template is created. 스 캐 폴드 템플릿 목록에서 목록 을 선택 했기 때문에 Visual Web Developer에서 뷰의 일부 기본 콘텐츠를 자동으로 생성 (스 캐 폴드) 합니다.Because you selected List in the Scaffold template list, Visual Web Developer automatically generated (scaffolded) some default content in the view. 스 캐 폴딩이 HTML 폼을 만들었습니다.The scaffolding created an HTML form. 클래스를 검사 하 Movie<label> 클래스의 각 속성에 대 한 요소를 렌더링 하는 코드를 만들었습니다.It examined the Movie class and created code to render <label> elements for each property of the class. 아래 목록에는 생성 된 만들기 뷰가 나와 있습니다.The listing below shows the Create view that was generated:

@ModelType IEnumerable(Of MvcMovie.Movie)

@Code
    ViewData("Title") = "SearchIndex"
End Code

<h2>SearchIndex</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            Title
        </th>
        <th>
            ReleaseDate
        </th>
        <th>
            Genre
        </th>
        <th>
            Price
        </th>
        <th></th>
    </tr>

@For Each item In Model
    Dim currentItem = item
    @<tr>
        <td>
            @Html.DisplayFor(Function(modelItem) currentItem.Title)
        </td>
        <td>
            @Html.DisplayFor(Function(modelItem) currentItem.ReleaseDate)
        </td>
        <td>
            @Html.DisplayFor(Function(modelItem) currentItem.Genre)
        </td>
        <td>
            @Html.DisplayFor(Function(modelItem) currentItem.Price)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", New With {.id = currentItem.ID}) |
            @Html.ActionLink("Details", "Details", New With {.id = currentItem.ID}) |
            @Html.ActionLink("Delete", "Delete", New With {.id = currentItem.ID})
        </td>
    </tr>
Next

</table>

응용 프로그램을 실행 하 고 /Movies/SearchIndex로 이동 합니다.Run the application and navigate to /Movies/SearchIndex. 쿼리 문자열(예: ?searchString=ghost)을 URL에 추가합니다.Append a query string such as ?searchString=ghost to the URL. 필터링된 영화가 표시됩니다.The filtered movies are displayed.

SearchQryStrSearchQryStr

SearchIndex이라는 매개 변수를 포함 하도록 메서드의 서명을 변경 하는 경우 id id 매개 변수는 {id} global.asax 파일에 설정 된 기본 경로에 대 한 자리 표시자와 일치 합니다.If you change the signature of the SearchIndex method to have a parameter named id, the id parameter will match the {id} placeholder for the default routes set in the Global.asax file.

{controller}/{action}/{id}

수정 된 메서드는 다음과 같습니다 SearchIndex .The modified SearchIndex method would look as follows:

Public Function SearchIndex(ByVal id As String) As ActionResult
Dim searchString As String = id
Dim movies = From m In db.Movies
             Select m

If Not String.IsNullOrEmpty(searchString) Then
    movies = movies.Where(Function(s) s.Title.Contains(searchString))
End If

Return View(movies)
End Function

이제 쿼리 문자열 값 대신 경로 데이터(URL 세그먼트)로 검색 제목을 전달할 수 있습니다.You can now pass the search title as route data (a URL segment) instead of as a query string value.

SearchRouteDataSearchRouteData

그러나 사용자가 영화를 검색하려고 할 때마다 URL을 수정하리라고 기대하지는 않을 것입니다.However, you can't expect users to modify the URL every time they want to search for a movie. 이제 영화를 필터링 하는 데 도움이 되는 UI를 추가 합니다.So now you you'll add UI to help them filter movies. 메서드의 서명을 변경 하 여 SearchIndex 경로 바인딩된 ID 매개 변수를 전달 하는 방법을 테스트 하는 경우 SearchIndex 메서드가 라는 문자열 매개 변수를 사용 하도록 다시 변경 합니다 searchString .If you changed the signature of the SearchIndex method to test how to pass the route-bound ID parameter, change it back so that your SearchIndex method takes a string parameter named searchString:

Views\Movies\SearchIndex.vbhtml 파일을 열고 바로 뒤에 @Html.ActionLink("Create New", "Create") 다음을 추가 합니다.Open the Views\Movies\SearchIndex.vbhtml file, and just after @Html.ActionLink("Create New", "Create"), add the following:

@Code
    ViewData("Title") = "SearchIndex"
    Using (Html.BeginForm())
         @<p> Title: @Html.TextBox("SearchString") 
         <input type="submit" value="Filter" /></p>
        End Using
End Code

Html.BeginForm도우미는 여는 태그를 만듭니다 <form> .The Html.BeginForm helper creates an opening <form> tag. 도우미를 사용 하면 Html.BeginForm 사용자가 필터 단추를 클릭 하 여 양식을 전송할 때 폼이 자신에 게 게시 됩니다.The Html.BeginForm helper causes the form to post to itself when the user submits the form by clicking the Filter button.

응용 프로그램을 실행 하 고 영화 검색을 시도 합니다.Run the application and try searching for a movie.

SearchIndxIE9_titleSearchIndxIE9_title

HttpPost메서드의 오버 로드가 없습니다 SearchIndex .There's no HttpPost overload of the SearchIndex method. 메서드가 응용 프로그램의 상태를 변경 하는 것이 아니라 데이터만 필터링 하기 때문에 필요 하지 않습니다.You don't need it, because the method isn't changing the state of the application, just filtering data. 다음 메서드를 추가한 경우 HttpPost SearchIndex 작업 호출자는 HttpPost SearchIndex 메서드와 일치 하 고 HttpPost SearchIndex 메서드는 아래 이미지와 같이 실행 됩니다.If you added the following HttpPost SearchIndex method, the action invoker would match the HttpPost SearchIndex method, and the HttpPost SearchIndex method would run as shown in the image below.

<HttpPost()>
 Public Function SearchIndex(ByVal fc As FormCollection, ByVal searchString As String) As String
     Return "<h3> From [HttpPost]SearchIndex: " & searchString & "</h3>"
 End Function

SearchPostGhostSearchPostGhost

장르 별 검색 추가Adding Search by Genre

HttpPost메서드 버전을 추가한 경우 SearchIndex 지금 삭제 합니다.If you added the HttpPost version of the SearchIndex method, delete it now.

다음으로, 사용자가 장르로 영화를 검색할 수 있는 기능을 추가 합니다.Next, you'll add a feature to let users search for movies by genre. SearchIndex 메서드를 다음 코드로 바꿉니다.Replace the SearchIndex method with the following code:

Public Function SearchIndex(ByVal movieGenre As String, ByVal searchString As String) As ActionResult
    Dim GenreLst = New List(Of String)()

    Dim GenreQry = From d In db.Movies
                   Order By d.Genre
                   Select d.Genre
    GenreLst.AddRange(GenreQry.Distinct())
    ViewBag.movieGenre = New SelectList(GenreLst)

    Dim movies = From m In db.Movies
                 Select m

    If Not String.IsNullOrEmpty(searchString) Then
        movies = movies.Where(Function(s) s.Title.Contains(searchString))
    End If

    If String.IsNullOrEmpty(movieGenre) Then
        Return View(movies)
    Else
        Return View(movies.Where(Function(x) x.Genre = movieGenre))
    End If

End Function

이 버전의 SearchIndex 메서드는 추가 매개 변수를 사용 movieGenre 합니다. 즉,This version of the SearchIndex method takes an additional parameter, namely movieGenre. 코드의 처음 몇 줄은 개체를 만들어 List 데이터베이스에서 영화 장르를 보관 합니다.The first few lines of code create a List object to hold movie genres from the database.

다음 코드는 데이터베이스에서 모든 장르를 검색하는 LINQ 쿼리입니다.The following code is a LINQ query that retrieves all the genres from the database.

Dim GenreQry = From d In db.Movies
                   Order By d.Genre
                   Select d.Genre

코드는 AddRange 제네릭 컬렉션의 메서드를 사용 하 여 List 모든 고유 장르를 목록에 추가 합니다.The code uses the AddRange method of the generic List collection to add all the distinct genres to the list. 한정자를 사용 하지 않고 Distinct 중복 장르를 추가 합니다. 예를 들어 코미디는 샘플에서 두 번 추가 됩니다.(Without the Distinct modifier, duplicate genres would be added — for example, comedy would be added twice in our sample). 그런 다음 코드는 장르 목록을 개체에 저장 합니다 ViewBag .The code then stores the list of genres in the ViewBag object.

다음 코드에서는 매개 변수를 확인 하는 방법을 보여 줍니다 movieGenre .The following code shows how to check the movieGenre parameter. 비어 있지 않은 경우 코드는 선택한 영화를 지정 된 장르로 제한 하도록 동영상 쿼리를 추가로 제한 합니다.If it's not empty the code further constrains the movies query to limit the selected movies to the specified genre.

If String.IsNullOrEmpty(movieGenre) Then
        Return View(movies)
    Else
        Return View(movies.Where(Function(x) x.Genre = movieGenre))
    End If

장르 검색을 지원 하기 위해 SearchIndex 뷰에 태그 추가Adding Markup to the SearchIndex View to Support Search by Genre

도우미 Html.DropDownList 바로 앞에 Views\Movies\SearchIndex.vbhtml 파일에 도우미를 추가 TextBox 합니다.Add an Html.DropDownList helper to the Views\Movies\SearchIndex.vbhtml file, just before the TextBox helper. 완성 된 태그는 다음과 같습니다.The completed markup is shown below:

<p>
    @Html.ActionLink("Create New", "Create")
    @Code
    ViewData("Title") = "SearchIndex"
    Using (Html.BeginForm())
         @<p> Genre: @Html.DropDownList("movieGenre", "All")
         Title: @Html.TextBox("SearchString") 
         <input type="submit" value="Filter" /></p>
        End Using
End Code
</p>

응용 프로그램을 실행 하 고 /Movies/SearchIndex로 이동 합니다.Run the application and browse to /Movies/SearchIndex. 장르, 영화 이름 및 두 조건에 따라 검색을 수행 합니다.Try a search by genre, by movie name, and by both criteria.

이 섹션에서는 프레임 워크에 의해 생성 된 CRUD 작업 메서드 및 뷰를 검사 했습니다.In this section you examined the CRUD action methods and views generated by the framework. 사용자가 영화 제목 및 장르로 검색할 수 있는 검색 작업 메서드 및 보기를 만들었습니다.You created a search action method and view that let users search by movie title and genre. 다음 섹션에서는 모델에 속성을 추가 하는 방법 Movie 및 테스트 데이터베이스를 자동으로 만드는 이니셜라이저를 추가 하는 방법을 살펴봅니다.In the next section, you'll look at how to add a property to the Movie model and how to add an initializer that will automatically create a test database.