我发现了一些与我相似的帖子,但我找不到符合我需要的答案。 问题如下:
我有一个像这样的viewmodel:
public class PrefViewModel
{
public SelectList countries { get; set; }
public SelectList Provincies { get; set; }
public ApplicationUser user { get; set; }
public Preference MyPref{ get; set; }
public int mycountry { get; set; }
public int myprovince { get; set; }
}
我的cshtml看起来像这样:
@using (Html.BeginForm("Index","Preferences", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<div class="form-group">
@Html.LabelFor(model => model.user.UserName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="control-label col-md-10">
<span class="textvak">
@Html.TextBoxFor(model => model.user.UserName, new { disabled = "disabled", @readonly = "readonly" })
</span>
@Html.ValidationMessageFor(model => model.user.UserName, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.user.Email, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="control-label col-md-10">
<span class="textvak">
@Html.TextBoxFor(model => model.user.Email, new { disabled = "disabled", @readonly = "readonly" })
</span>
@Html.ValidationMessageFor(model => model.user.Email, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.user.Unhashed, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.user.Unhashed, new { htmlAttributes = new { @class = "form-control", type = "password" } })
@Html.ValidationMessageFor(model => model.user.Unhashed, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.user.Provincie.Land, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="control-label col-md-10">
@Html.DropDownListFor(model => model.mycountry, Model.countries, new { Name = "ddlLand", id = "ddlLanden", @class = "textvak" })
@Html.ValidationMessageFor(model => model.user.Provincie.Land, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.user.Provincie, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="control-label col-md-10">
@Html.DropDownListFor(model => model.myprovince, Model.Provincies, new { @class = "textvak" })
@Html.ValidationMessageFor(model => model.user.Provincie, "", new { @class = "text-danger" })
</div>
</div>
<br />
<table>
<tr>
<td>
<input type="submit" value=@Resources.Wijzig class="btn btn-default" />
</td>
</tr>
</table>
}
在我的控制器中,我尝试将发布的PrefViewModel恢复如下:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(PrefViewModel TestMymodel)
{
if (ModelState.IsValid)
{
int myCountry = TestMymodel.mycountry;
int myprovince = TestMymodel.myprovince;
}
return View();
}
我的问题是,PrefViewModel TestMymodel永远不会填充我认为我回发的值。对我来说更奇怪的是我确实得到了Unhashed密码,但所有其他值都是0或null。 我可以将值放在PrefViewModel中来加载页面并且它可以正常工作,但是在Posting它几乎完全是空的。
有什么想法吗?
编辑:我确实将默认模式更改为自己编制的模型,这会有什么不同吗?例如,当我调用Create操作时,我确实在我的帖子中获取了值(来自create offcourse)。我有点绝望了
edit2:这是发布的内容:
__ RequestVerificationToken:-JYcw0CH2zZ7WrGUiYJM6-R6VxfL41ykTD5EHUjgtyyFcN01AaUU61BYuaRNr4oPdEvDq09aYsOFdb8fObJTXMnTKulADVkGY8CrBG3U71QXw0g7Th86WKl1up4059Zy7mW0SlrWGJpehed586v_5g2 user.Unhashed:Jonas1234- user.Unhashed:Jonas1234- ddlLand:1 ddlProvincie:3
(无法添加我的声望图片,所以这里有完整帖子的链接:http://postimg.org/image/id95wjcxp/)
好的,当我将下拉列表的名称更改为PrefViewModel属性名称时,返回的值正确。
答案 0 :(得分:0)
您似乎已将下拉列表的名称覆盖为某些值,这些值与视图模型中的属性名称不同。这就是为什么值没有被成功绑定回来的原因。如果希望默认模型绑定器能够将它们绑定回视图模型,请确保输入字段与视图模型上的属性具有相同的名称。
您的用户名文本框也有禁用标记:
@Html.TextBoxFor(model => model.user.UserName, new { disabled = "disabled", @readonly = "readonly" })
所以它不会被提交回服务器。如果您希望这些值返回,则可能需要添加其他隐藏字段。或者只使用readonly
而不使用disabled
属性。这两个属性都阻止用户修改相应输入字段中的值,但除此之外,disabled
属性在提交表单时将其从POST有效内容中删除。
所以你可以使用:
@Html.TextBoxFor(model => model.user.UserName, new { @readonly = "readonly" })