我的局部视图没有正确地将值传递给模型

时间:2013-07-16 18:41:26

标签: c# html asp.net-mvc asp.net-mvc-4 razor

我有一个很大的问题,我非常困惑。 我先给你一点背景知识。 我有两个模型,一个包含另一个模型,如

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)

{}

现在我拥有直接通过主视图传递的所有数据,但是部分视图中的任何内容都没有像我想要的那样填充模型。现在这是我正在研究的移动网站的一部分,我实际上在桌面上有一些非常相似的东西,所以我真的很困惑为什么它不会工作。任何想法/建议将不胜感激。

2 个答案:

答案 0 :(得分:2)

你的绑定错误。您在控制器中不需要2个型号。您可以使用主模型绑定子模型,如

部分视图

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

带1个型号的控制器

public ActionResult MyAction(AccountViewModel model)

另外我建议您通过ViewData传递前缀,以使您的视图更加灵活。

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

使用此选项,您可以在许多控制器操作中使用此视图。只需传递前缀并将您的子模型绑定到您需要的任何模型。

答案 1 :(得分:1)

将您的局部视图放在Views / Shared / EditorTemplates文件夹中。

然后,用你的视图替换Html.Partial行:

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

并用此代替你的行动:

public ActionResult MyAction(AccountViewModel model)
{
  // Some code...
}