Viewmodel值未返回到控制器

时间:2015-01-11 15:44:58

标签: c# asp.net asp.net-mvc-5

我发现了一些与我相似的帖子,但我找不到符合我需要的答案。 问题如下:

我有一个像这样的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属性名称时,返回的值正确。

1 个答案:

答案 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" })