我有一个很大的问题,我非常困惑。 我先给你一点背景知识。 我有两个模型,一个包含另一个模型,如
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)
{}
现在我拥有直接通过主视图传递的所有数据,但是部分视图中的任何内容都没有像我想要的那样填充模型。现在这是我正在研究的移动网站的一部分,我实际上在桌面上有一些非常相似的东西,所以我真的很困惑为什么它不会工作。任何想法/建议将不胜感激。
答案 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...
}