2012-05-05 5 views
1

그래서 ASP.NET MVC를 사용하여 새 프로젝트를 만들고 있습니다. 솔직히 나는 그것의 간단한 질문이 있기 전에 그것 (또는 어떤 웹 개발)로 거의 경험이 없다.양식을 통해 부분 뷰에서 컨트롤러 동작으로 복잡한 유형 전달

부분보기는 다양한 웹보기간에 공유되는 검색 창입니다. 보기에는 드롭 다운 목록과 텍스트 상자가 있습니다. 사용자가 검색 버튼을 사용하여 양식을 게시하면 값이 SearchFilterModel 개체로 검색 컨트롤러의 색인 작업에 도착해야합니다.

이제 양식이 검색 컨트롤러에서 색인 작업을 호출하고 있습니다. 작동 중입니다 (첨부 된 코드 참조). 하지만 문제는 인덱스 메서드의 id 매개 변수 (SearchFilterModel이어야 함)가 도착하지 않는다는 것입니다 (null 임).

폼에서 컨트롤러로 개체를 전달하는 방법을 모르겠습니다. ¿ 내가 뭘 잘못하고있어? 내가 보낸 매개 변수의 유형을 변경 (new { id = "something" }new { id = search }를 교체 할 경우

건이며, 다음 문자열은 도착 (작동) 또는 내가 new { id = 1 }를 작성하는 경우 다음 INT 내가 일 SearchFilterModel을 그와 관련된 뭔가가 같아요. 도착 기본 타입이지만 복잡한 일이 아니다.

어떤 생각?

@using Hermes.Models.Helpers 

@{ 
    var search = CacheHelper.Instance.SearchFilter; 
    using (Html.BeginForm("Index", "Search", new { id = search }, FormMethod.Post)) 
    { 
     @Html.ValidationSummary(true, "No se creó la cuenta. Corrija los errores e inténtelo de nuevo.") 
     <div> 
      <fieldset> 
       <legend>Búsqueda por tipo de producto</legend> 

       <div class="editor-label"> 
        @Html.LabelFor(s => search.SearchFilter) 
        &nbsp;&nbsp;&nbsp; 
        @Html.DropDownListFor(s => search.SelectedSearchFilter, new SelectList(search.SearchFilter)) 
        &nbsp;&nbsp;&nbsp; 
        @Html.LabelFor(s => search.SearchQuery) 
        &nbsp;&nbsp;&nbsp; 
        @Html.TextBoxFor(s => search.SearchQuery) 
        @Html.ValidationMessageFor(s => search.SearchQuery) 
        &nbsp;&nbsp;&nbsp;&nbsp; 
        <input type="submit" value="Buscar" /> 
       </div> 
      </fieldset> 
     </div> 
    } 
} 

검색 컨트롤러의 색인 작업

[HttpPost] 
     public ActionResult Index(SearchFilterModel id) 
     { 
      var x = CacheHelper.Instance.SearchFilter; 

      ViewBag.Filter = id.SelectedSearchFilter; 
      ViewBag.msg = String.Format("Se están buscando {0}, con el filtro {1}", id.SelectedSearchFilter, id.SearchQuery); 
      ViewBag.ResultsCount = 0; 

      return View(); 
     } 

SearchFilterModel

public class SearchFilterModel 
{ 
    [Required] 
    [DataType(DataType.Text)] 
    [Display(Name = "¿Qué características?")] 
    public string SearchQuery { get; set; } 

    [Required] 
    [DataType(DataType.Text)] 
    [Display(Name = "¿Qué buscar?")] 
    public List<String> SearchFilter { get; set; } 

    [Required] 
    [DataType(DataType.Text)] 
    [Display(Name = "¿Qué buscar?")] 
    public string SelectedSearchFilter { get; set; } 
} 
+0

부분보기에서 색인 contrller로 SearchFilterModel 객체를 전달하려는 것 같습니다. –

+0

@COLDTOLD 그게 제목이 말하는 것입니다 :) ¿ 어떤 생각? –

+0

SearchFilterModel 클래스 – Baz1nga

답변

0

없음을 작동 만들 수 없습니다하는 데 필요한 정보를 포함하고 있기 때문에 폼 태그를 교체해야 해결책이었다 : "홈"컨트롤러에서

(그보기는 "검색"부분보기를 표현합니다) SearchViewModel의 새 인스턴스를 선언하고 "홈"보기로 전달 (ViewBag 경유) "홈"보기에서 복구하고 "검색"부분보기로 전달합니다 Render 방법 :

SearchFilterModel searchFilter = ViewBag.SearchFilter; 
@Html.Partial("SearchProduct", searchFilter) 

이제 "검색"보기에서 시작 양식을 평소와 같이 선언하면 이제는 완벽하게 작동합니다. 문제는 객체의 수명과 관련이있는 것으로 보입니다. (제 질문과 원래의 시도에서 폼 바로 앞에 선언하려고했는데 그렇게 할 수 없다고 생각됩니다) . 이제는 훌륭하게 작동하지만이 방법으로 수행 할 때 성능에 미치는 영향에 대해 우려하고 있습니다. 모든 suggest'll 크게 주시면 감사하겠습니다.

1

당신은 구문이 클래스 정의와 일치하는 JSON을 구축하고 다음 행동을 통해이 데이터를 전송하고 MVC는 당신의 클래스에 JSON의 변환을 처리해야하거나 Deserialize을 사용할 수해야 메서드를 호출하고 객체를 문자열로 만듭니다.

따라서 이벤트 처리기를 제출 함수에 바인딩 한 다음 일부 ajax API를 사용하여 데이터를 전송하십시오. 다음은 jquery를 사용한 예입니다.

var searchFilter=[]; 
for each(value in the dropdown) 
    searchFilter.push(value); 

var searchFilterModel={ 
SearchQuery: "value1", //get the data from the textbox 
SelectedSearchFilter: "value2", //get the value from dom 
SearchFilter: searchFilter 
} 

$.ajax(
{ 
url: url //your action method 
data: { 
SearchFilterModel:searchFilterModel 
}, 
success:function(){} //callback function 
}) 

동작 서명은 동일하게 유지됩니다.

과 JavaScriptSerializer 방법 사용하기 :

var searchFilter=[]; 
for each(value in the dropdown) 
    searchFilter.push(value); 

var searchFilterModel={ 
SearchQuery: "value1", //get the data from the textbox 
SelectedSearchFilter: "value2", //get the value from dom 
SearchFilter: searchFilter 
} 

$.ajax(
{ 
url: url //your action method 
data: { 
id1: searchFilterModel 
}, 
success:function(){} //callback function 
}) 

[HttpPost] 
public ActionResult Index(string id1) 
{ 
var id=new JavaScriptSerializer().Deserialize<SearchFilterModel>(id1); 
var x = CacheHelper.Instance.SearchFilter; 
ViewBag.Filter = id.SelectedSearchFilter; 
ViewBag.msg = String.Format("Se están buscando {0}, con el filtro {1}", id.SelectedSearchFilter, id.SearchQuery); 
ViewBag.ResultsCount = 0; 
return View(); 
} 

이 당신을 위해 밖으로 작동하는지 알려주세요 ..를

+0

궁금한데, 이것이 이것을 작동시키는 유일한 방법일까요? 내 질문에 간다 '노력하고있어 그 결과 그 부분의보기 (다른 개체가 아닌) 모델로 SearchFilterModel 설정 한 경우 폼 선언에 param 같이 설정하지 않고 작동합니다. 아니면 프레임 워크가 자동으로 만든 "모델"이라고 가정합니다. –

0

형태의 복잡한 객체를 게시 할 때, 그것은 속성 "이름"과 일치하는 것이 중요합니다 objects 속성.

@Html.TextBoxFor(s => search.SearchQuery)을 사용하면 mvc가 필요한 속성을 생성합니다.

그리고 양식이 객체 그렇게 마지막으로 게시 된 답변 using (Html.BeginForm("Index", "Search", FormMethod.Post))

관련 문제