2014-06-19 1 views
0

MVC 5, C#을 사용하고 있으며 각 키 스트로크에서 필터링 할 검색 필터를 만들려고합니다. 텍스트 상자는 그대로 작동하지만 제출 후 텍스트 상자가 지워집니다. 이제 이것이 아마도 그 중 가장 좋은 접근 방법이 아닙니다. 그것이 글을 지울 때 텍스트 상자를 지우지 않거나 더 나은 방법이 더 좋은 대안이 될 때 그렇게 할 수있는 방법이 있습니까?검색 방법 문제

@using (Html.BeginForm("Index", "Directory", FormMethod.Post, new { id = "form" })) 
    { 
     <p> 
      Search Employee: <input type="text" name="userName" onkeyup="filterTerm(this.value);" /> 


     </p> 

    } 



<script> 
    function filterTerm(value) { 
     $("#form").submit(); 
     event.preventDefault(); 
    } 
</script> 
+2

더 나은 대안은 자바 스크립트와 일부 AJAX 요청을 사용하는 것입니다 검색을 수행합니다. 모든 키 입력 *으로 페이지를 다시로드하는 것은 실제로 실행 가능한 사용자 경험이 아닙니다. ASP.NET MVC는 기본적으로 jQuery와 함께 제공되므로 jQuery UI AutoComplete 플러그인을 살펴보십시오. (또는 다른 많은 jQuery 자동 완성 플러그인 중 하나) – David

+0

데이터를 게시하는 대신'$ .ajax()'를 사용하면 어떨까요? 그리고 아마'Html.BeginForm'을'Ajax.BeginForm'으로 변경할 필요가있을 것입니다. – gunr2171

+0

값을 유지 보수하는 데 아약스를 사용하거나 텍스트 상자 태그의 Post 값으로 값을 설정할 수 있습니다. –

답변

1

더 좋은 방법은 도랑하는 것입니다 Html.BeginForm (실제로 뭔가 다른 필요하지 않는 한) 데이터를 얻기의 순수 아약스 방법을 사용합니다.

그래서 수정 된 HTML은 다음과 같습니다

<p> 
    Search Employee: 
    <input type="text" name="userName" onkeyup="filterTerm(this.value);" /> 
</p> 

<script> 
    function filterTerm(value) { 
     $.ajax({ 
      url: '@Url.Action("Index", "Directory")', 
      data: { 
       searchTerm: value 
      }, 
      cache: false, 
      success: function (result) { 
       //do something with your result, 
       //like replacing DOM elements 
      } 
     }); 
    } 
</script> 

는 또한 아약스 호출 될 동작을 변경해야합니다 (그리고 난 당신이 "인덱스"조치를 호출하는 이유를 모르겠어요).

public ActionResult Index(string searchTerm) 
{ 
    //lookup and do your filtering 

    //you have 2 options, return a partial view with your model 
    return PartialView(model); 

    //or return Json 
    return Json(model); 
} 

이 아약스의 가장 좋은 점은 거기에 어떤 게시물이 없습니다 그것은 비동기, 그래서 당신은 당신의 데이터 손실에 대해 걱정하지 않아도됩니다.

+0

컨트롤러에서 색인을 찾아야하기 때문에 ajax 작업을 index라고하지 않습니까? 또는 나는 여기에서 무엇인가 놓치고있다. –

+1

인덱스 대신 호출 할 컨트롤러 (예 : "SearchEmployees")에서 별도의 작업을 수행 할 것을 권장합니다. 색인은 일반적으로 다른 용도로 예약되어 있습니다. – gunr2171

2

질문에 대한 의견에 동의합니다. 모든 키 스트로크에 게시하면 좌절감을주는 사용자 경험이 될 것입니다.

두 가지 대답은 ajax를 사용하여 검색을 수행하고 (전체 페이지가 게시되지 않으므로 값을 유지함) 제출 단추가 있고 컨트롤러 입력 매개 변수와 동일한 입력 이름을 지정합니다. (기존 코드와 함께 사용)

컨트롤러 코드 :

public class DirectoryController : Controller 
{ 
    [HttpPost()] 
    public ActionResult Index(string userName) 
    { 
     // make the input argument match your form field name. 

     //TODO: Your search code here. 

     // Assuming you have a partial view for displaying results. 
     return PartialView("SearchResults"); 
    } 
} 

보기 코드 (Ajax를 사용하여 코드를 대체하기 위해) :

<p> 
    Search Employee:@Html.TextBox("userName", new { id = "user-name-input" }) 
</p> 
<div id="results-output"></div> 

<script type="text/javascript"> 
$("#user-name-input").change(function(e) { 
    $.ajax({ 
     url: '@Url.Action("Index", "Directory")' 
     , cache: false 
     , type: "post" 
     , data: {userName: $("#user-name-input").val() } 
    }).done(function (responseData) { 
     if (responseData != undefined && responseData != null) { 
      // make sure we got data back 
      $("#results-output").html(responseData); 
     } else { 
      console.log("No data returned."); 
      alert("An error occurred while loading data."); 
     } // end if/else 
    }).fail(function (data) { 
     console.log(data); 
     alert("BOOOM"); 
    }); 
} 
</script> 
+0

그 점을 지적 해 주셔서 감사합니다. 나는 항상 객체 이니셜 라이저에 어떤 이유로 VB와 csharp 구문을 혼합한다. : \ 이제 수정되었다. – xDaevax