0

私は非常に混乱している大きな問題を抱えています。最初に少し背景を説明します。私は2つのモデルを持っています.1つは他のようなものを含んでいます

public class AccountViewModel
{   
    public ChargeViewModel chargeViewModel { get; set; }
    other public values
}

これで、部分ビューをそのように参照するビューができました。

@model MyModels.AccountViewModel

[[Block_Header]]
@{ Html.RenderPartial("Header"); }
[[/Block_Header]]

[[ValidationSummary]]
@Html.ValidationSummary(false)      
[[/ValidationSummary]]

[[Block_ReloadOptions]]
    <div data-role="fieldcontain">
        <fieldset data-role="controlgroup" data-type="horizontal" class="amount-bar">
            <legend>Select an amount</legend>
            @{
                List<int> PresetValues = Main.Denominations.Split(',').Select(x => Convert.ToInt32(x.Trim())).ToList();    
            }       
            @if (PresetValues.Count > 0){
                int i = 1;
                foreach (int value in PresetValues) {                    
                    <input type="radio" name="amount" id="amount@(i)" value="@value" @(Model.chargeViewModel.ChargeAmount == value ? "checked" : "")>
                    <label for="amount@(i)">$@value</label>
                    i++;
                } 
            }           
            <label for="select-amount">Select Amount</label>
            <select name="select-amount" id="select-amount" class="select-amount" data-role="select">
                <option value="">Other</option>
                   @if (Model.chargeViewModel.OtherValues.Count > 0){                      
                        foreach (int value in Model.chargeViewModel.OtherValues)
                        {
                            <option value="@value" @(Model.chargeViewModel.ChargeAmount == value ? "selected" : "") >$@value</option>                           
                        }
                    }                   
            </select>
            @Html.HiddenFor(m => m.chargeViewModel.ChargeAmount, new { id="hiddenAmount", value="0" })
        </fieldset>
    </div>

関連性のないいくつかのフォームがここにあり、次のように下部に私の部分的なビューがあります

@Html.Partial("MobileModelView", Model.chargeViewModel)

今、私の部分的なビューは次のようになります

@model VirtualNext.Web.Models.ChargeViewModel
<div class="ui-block-a">
        <fieldset data-role="controlgroup" data-type="horizontal" class="field-margin validate expiry-select">
                <label for="select-expiry-month" class="ui-hidden-accessible">Month</label>
                @Html.DropDownListFor(m => m.ExpMonth, Model.ddlMonths, new { id = "select-expiry-month", @class= "validate"})
                <label for="select-expiry-year" class="ui-hidden-accessible">Year</label>
                @Html.DropDownListFor(m => m.ExpYear, Model.ddlYears, new { id = "select-expiry-year", @class= "validate validateExpiry validateYear" })
        </fieldset>
    </div>

そのため、コントローラーのモデルに m.ExpMonth と m.ExpYear の値を渡す際に問題が発生しています。Request.Form の値を確認しましたが、値が入力されていますが、コントローラーの post メソッドには入力されていません。

私のコントローラーは次のようになります

public ActionResult MyAction(AccountViewModel model, ChargeViewModel chargeViewModel)

{}

これで、メイン ビューを介して直接渡したすべてのデータが得られましたが、部分ビューからは、希望どおりにモデルにデータが入力されていません。現在、これは私が取り組んでいるモバイル サイトの一部であり、実際にデスクトップ側でも非常によく似たものを持っているので、なぜ機能しないのか本当に混乱しています。どんなアイデア/提案も大歓迎です。

4

2 に答える 2

2

バインディングが間違っています。コントローラーに2つのモデルは必要ありません。サブモデルをメインモデルにバインドできます

部分図

@model VirtualNext.Web.Models.ChargeViewModel
@{
    ViewData.TemplateInfo.HtmlFieldPrefix = "AccountViewModel"; //bind to main model
}

1モデルのコントローラー

public ActionResult MyAction(AccountViewModel model)

さらに、ビューをより柔軟にするために、ViewData で Prefix を渡すことをお勧めします。

@model VirtualNext.Web.Models.ChargeViewModel
@{
    ViewData.TemplateInfo.HtmlFieldPrefix = ViewData["htmlprefix"];
}

このオプションを使用すると、このビューを多くのコントローラー アクションで使用できます。プレフィックスを渡して、サブモデルを必要なモデルにバインドするだけです。

于 2013-07-16T18:56:48.740 に答える
1

部分ビューを Views/Shared/EditorTemplates フォルダーに配置します。

次に、ビューの Html.Partial 行を次のように置き換えます。

@Html.EditorFor(model => model.ChargeViewModel, "MobileModelView")

そして、あなたのアクションをこれに置き換えます:

public ActionResult MyAction(AccountViewModel model)
{
  // Some code...
}
于 2013-07-16T18:59:11.987 に答える