1

次の問題があります。私のビュー モデルでは、いくつかのリスト プロパティを次のように定義しました。

public class BasketAndOrderSearchCriteriaViewModel
{
    List<KeyValuePair> currencies;
    public ICollection<KeyValuePair> Currencies
    {
        get
        {
            if (this.currencies == null)
                this.currencies = new List<KeyValuePair>();
            return this.currencies;
        }
    }

    List<KeyValuePair> deliverMethods;
    public ICollection<KeyValuePair> DeliveryMethods
    {
        get
        {
            if (this.deliverMethods == null)
                this.deliverMethods = new List<KeyValuePair>();
            return this.deliverMethods;
        }
    }
 }

このビュー モデルは別のビュー モデルに埋め込まれています。

 public class BasketAndOrderSearchViewModel
 {
    public BasketAndOrderSearchCriteriaViewModel Criteria
    {
        [System.Diagnostics.DebuggerStepThrough]
        get { return this.criteria; }
    }
 }

2 つのアクション メソッドを使用します。1 つは GET 用で、もう 1 つは POST 用です。

[HttpGet]
public ActionResult Search(BasketAndOrderSearchViewModel model){...}

[HttpPost]
public ActionResult SubmitSearch(BasketAndOrderSearchViewModel model){...}

ビューでは、List プロパティの DropDownLists を自動的に表示したくない EditorFor-Html ヘルパーを使用して、ビュー モデル全体を実装します。 1. 質問: EditorFor に DropDownList を表示させるにはどうすればよいですか?

EditorFor を使用して DropDownLists を表示する方法がわからなかったので、DropDownList Html ヘルパーを使用して、次のようにビュー モデルに入力しました。

    public IEnumerable<SelectListItem> DeliveryMethodAsSelectListItem()
    {
        List<SelectListItem> list = new List<SelectListItem>();
        list.Add(new SelectListItem()
        {
            Selected = true,
            Text = "<Choose Delivery method>",
            Value = "0"
        });
        foreach (var item in this.DeliveryMethods)
        {
            list.Add(new SelectListItem()
            {
                Selected = false,
                Text = item.Value,
                Value = item.Key
            });
        }

        return list;
    }

私の 2. 質問: ご覧のとおり、POST 属性を使用してビュー モデルをアクション メソッドに渡します。渡されたビュー モデルにバインドされた DropDownList の選択された値を取得する方法はありますか? 現時点では、すべての DropDownList が空であり、選択した値は Request.Form によってのみ取得できますが、これは絶対に避けたいです!

これに関するいくつかのアイデアやヒントをいただければ幸いです。

4

2 に答える 2

2

最近この投稿にたどり着いた私のような人には、http://www.asp.net/mvc/tutorials/mvc-music-store-part-1 からチュートリアルを完全にダウンロードすることをお勧めします .NET MVC アプリケーションに関連する一般的な手法について説明します。

とにかく、あなたの投稿と回答者に本当に役立ちます(私があなたに投票できるなら、私はそうします:)

于 2010-10-31T19:57:07.093 に答える
1

これを試してみましょう:

質問 1 への回答: EditorFor に DropDownList を表示させるにはどうすればよいですか?

呼び出すときHtml.EditorFor()に、追加の ViewData 値を EdiorTemplate ビューに渡すことができます。

<%: Html.EditorFor(model => Model.Criteria, new { DeliveryMethods = Model.DeliveryMethods, Currencies = Model.Currencies}) %>

これで、EditorTemplate 内ViewData["DeliveryMethods"]で初期化され、使用できるようになりました。ViewData["Currencies"]

あなたEditorTemplateはどうにかしてこれらのエントリを呼び出して DropDowns / SelectLists に変換する必要があります。タイプの ascx ファイルがあると仮定するとSystem.Web.Mvc.ViewUserControl<BasketAndOrderSearchCriteriaViewModel>、次のことができます。

<%: Html.LabelFor(model => model.DeliveryMethods) %>
<%: Html.DropDownList("SelectedDeliveryMethod", new SelectList(ViewData["DeliveryMethods"] as IEnumerable, "SelectedDeliveryMethod", "Key", "value", Model.SelectedDeliveryMethod)) %>

同じことが通貨にも当てはまります。

<%: Html.LabelFor(model => model.Currencies) %>
<%: Html.DropDownList("SelectedCurrency", new SelectList(ViewData["Currencies"] as IEnumerable, "SelectedDeliveryMethod", "Key", "value", Model.SelectedCurrency)) %>

この設定により、あなたDeliveryMethodAsSelectListItem()は時代遅れになり、あらゆる種類のリストを使用できます。KeyValuePairs にバインドされていないことを意味します。Html.DropDownList()これからは通話を調整する必要があります。

ご覧のとおり、いくつかの新しいプロパティを に導入しましたBasketAndOrderSearchCriteriaViewModel

Model.SelectedDeliveryMethod
Model.SelectedCurrency

現在選択されている値を保存するために使用されます。

質問 2 への回答: 渡されたビュー モデルにバインドされた DropDownList の選択された値を取得する方法はありますか?

EditorFor テンプレートでは、新しく作成されたプロパティを として渡しModel.SelectedDeliveryMethodますModel.SelectedCurrency( DropDownList 拡張メソッドの 4 番目のオーバーロードをSelectedValue Parameter参照してください)。

ビューが仕事をするようになったので、 POSTアクション内で現在選択されている値を取得するにはどうすればよいでしょうか?

これは本当に簡単です:

[HttpPost]
public ActionResult SubmitSearch(BasketAndOrderSearchViewModel model)
{
    ...
    var selectedDeliveryMethod = model.Criteria.SelectedDeliveryMethod;
    var selectedCurrency model.Criteria.SelectedDeliveryMethod;
    ...
}

注: 現在、テストするための IDE はありませんが、トリックを実行するか、少なくとも進むべき方向を示す必要があります。

于 2010-06-11T09:06:08.033 に答える