0

ProductListingViewModel型の強く型付けされたビューがあり、これにはProductViewModelが含まれています。(両方のカスタムビューモデル)。

ページにいくつかのフォーム要素があり、これらは次のように作成されます。

<%: Html.DropDownListFor(m => m.ProductViewModel.CategoryId, Model.Categories)%>

HTMLを生成します:

<select name="ProductViewModel.CategoryId" id="CategoryId">

デフォルトのモデルバインディングでは、ProductListingViewModelタイプのパラメーターを受け入れるコントローラーアクションに投稿するときに、ProductViewModel.CategoryIdに関連データを入力することがわかっていると予想していました。

選択リストの名前は、CategoryIdプロパティを持つProductViewModelがあることを示しているようですが、コントローラーメソッドに投稿すると、ProductViewModelがnullになります。ProductListingViewModelの構築中にこれを作成すると、nullではなくなりますが、デフォルトのバインダーが期待どおりにプロパティに入力されていないようです。

これはカスタムモデルバインダーの場合ですか、それとも基本的なものが欠けているだけですか?

乾杯。

4

2 に答える 2

1

要約してみましょう(間違っている場合は訂正してください)。

モデル:

public class ProductListingViewModel
{
    public ProductViewModel ProductViewModel { get; set; }
    public IEnumerable<SelectListItem> Categories { get; set; }
}

public class ProductViewModel
{
    public string CategoryId { get; set; }
}

コントローラ:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new ProductListingViewModel
        {
            Categories = new SelectList(new[]
            {
                new { Value = "1", Text = "category 1" },
                new { Value = "2", Text = "category 2" }
            }, "Value", "Text")
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(ProductListingViewModel model)
    {
        return View(model);
    }
}

意見:

<% using (Html.BeginForm()) { %>
    <%: Html.DropDownListFor(m => m.ProductViewModel.CategoryId, Model.Categories)%>
    <input type="submit" value="OK" />
<% } %>

フォームを送信すると、次のようになります。

model.ProductViewModel.CategoryId = the id that was selected in the drop down list

あなたが求めているものではありませんか?

于 2010-07-16T16:41:04.037 に答える
0

この場合、デフォルトのバインダーが機能するはずです。

クライアントから送信されたデータをチェックするためにFiddlerを使用してみましたか?

コントローラアクションのシグネチャは正確には何ですか?

于 2010-07-16T16:46:10.533 に答える