2012-05-05 6 views
1

したがって、私はASP.NET MVCを使用して新しいプロジェクトに取り組んでいます。正直なところ、私はあまり簡単な質問の前にそれを(または任意のWeb開発)経験はほとんどありません。フォームを使用して部分的なビューからコントローラのアクションに複合型を渡す

私は、ウェブビューのさまざまな間で共有される検索ボックスの部分的なビューを持っています。ビューにはドロップダウンリストとテキストボックスがあります。ユーザーが検索ボタンを使用してフォームを投稿すると、値がSearchFilterModelオブジェクトとして検索コントローラのインデックスアクションに到達する必要があります。

フォームは、検索コントローラでインデックスアクションを呼び出しています。それは働いています(添付のコードを参照)。しかし、問題は、インデックスメソッドのidパラメータ(それはSearchFilterModelである必要があります)が届かないことです(nullです)。

フォームからオブジェクトをコントローラに渡す方法がわかりません。 ¿私が間違っていることは何ですか?

事は、私がもので、関連する何かがSearchFilterModelことがありますね。私は(送信されるパラメータの種類を変更new { id = "something" }new { id = search }を交換した場合、その文字列が到着(それが動作)、または私はnew { id = 1 }を書くならば、int型が到着していますネイティブ型が、複雑なものではありません。

任意のアイデアは?

@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> 
    } 
} 

検索コントローラのindexアクション

[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(); 
     } 

あなたはその構文クラス定義と一致したJSONを構築し、あなたの行動に渡ってこのデータを送信し、MVCは、あなたのクラスにJSONの変換を処理すべきか、Deserializeを使用することができますする必要が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

あなたは、部分的なビューからインデックスコントラにSearchFilterModelオブジェクトを渡したいと思うようです。 –

+0

@COLDTOLDこれは、タイトルが言うことです:)¿任意のアイデア? –

+0

SearchFilterModelクラス – Baz1nga

答えて

0

なしので、最終的に解決策だった動作しませ作成するために必要な情報が含まれているので、あなたは、formタグを置き換える必要があります。

「ホーム」のコントローラでは(私はSearchViewModelの新しいインスタンスを宣言し、 "ホーム"ビュー(ViewBag経由)に渡し、 "ホーム"ビューでそれを回復し、 "検索"部分ビューに渡しますRender方法:

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

「検索」ビューでは、通常のように「開始」フォームを宣言するだけで完全に機能します。問題はオブジェクトの生涯に関連しているように思えます(私の質問とフォームの直前でそれを宣言しようとしていた私の元の試みで、それはできないと私には思われます) 。さて、それは素晴らしい作品ですが、私はこのようにそれを行う上でのパフォーマンスの影響について懸念しています。どんな提案も大歓迎です。

1

メソッドを呼び出してオブジェクトを文字列として作成します。

このように、イベントハンドラを送信関数にバインドし、いくつかの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))

関連する問題