2009-08-06 5 views
4

Html.TextBox 컨트롤을 사용하여 페이지에 검색 상자가 있습니다 (실제로는 부분 뷰 임에도 불구하고 확실하지 않음).ASP.NET MVC - Html.TextBox - 값이 ViewData 사전에 설정되지 않았습니다.

<%= Html.TextBox("query", ViewData["query"], new { style = "width: 90%;" })%> 

는 액션 메소드는 매개 변수로 "쿼리를"한다, 나는 전달 된 문자열을 정리하기 위해이 값을 편집 : 그것은 Html.TextBox에 도달 할 때, 그러나

public ActionResult SearchQuery(string query) { 

    ViewData["query"] = StringFunctions.ProperCasing(query.Replace("_", " ")); 

을 원래 쿼리 값 (이 경우 밑줄 표시)이 보존됩니다. I은 수정 된 값을 ViewData 필드임을 알 수 있으므로, 예를 들면, :

query == "data_entry" 

그리고, 이후는이 도달되면, 동작 방법

ViewData["query"] == "data entry" 

하지만 값으로 전달되고 보기, Html.TextBox 여전히 "data_entry"입니다. 액션 메소드 매개 변수 "검색어"와 검색 창 양식 매개 변수 "검색어"사이에 충돌이있는 것 같습니다. 누구든지 여기에서 무슨 일이 일어나고 있는지 또는 가치를 전달할 다른 방법이 있는지 알고 있습니까?

이 동작 방법은 검색 창 데이터를 게시 한 결과와 다른 동작입니다.

답변

5

Html.Textbox 도우미 (ASP.NET MVC source InputExtensions.cs 라인 (183), HtmlHelper.cs 라인 (243))을 제 ModelState 찾는다. 가장 간단한 해결책은 '검색어'에 대해 ModelState을 삭제하는 것입니다.

public ActionResult SearchQuery(string query) 
{ 
    ViewData["query"] = StringFunctions.ProperCasing(query.Replace("_", " ")); 

    ModelState.Remove("query"); 

    return View(); 
} 
0

이것이 문제인지는 모르겠지만 첫 번째 생각은 컨트롤러에서보기 데이터를 다시 전달하는 것입니다.

public ActionResult SearchQuery(string query) 
{  
    ViewData["query"] = StringFunctions.ProperCasing(query.Replace("_", " ")); 
    return view(ViewData): 
} 
관련 문제