为什么POST ASP MVC上的ViewModel数据为null

时间:2015-06-28 21:13:32

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

我在ASP .NET MVC 5上做表单。我认为在动作中发布匹配模型很简单,但我的动作仍然保持空值。例如,

@model Tuple<ManageLoginsViewModel, IndexViewModel, LocalPasswordModel, SetPasswordViewModel>

<p>
    You do not have a local password for this site. Add a local
    password so you can log in without an external login.
</p>

@using (Html.BeginForm("SetPassword", "Manage", FormMethod.Post))
{
    @Html.AntiForgeryToken()
    <fieldset>
        <legend>Set Password</legend>
        <div>
            <div class="LabelPassword">
                <label>New password</label>
                <input data-val="true" data-val-length="The New password must be at least 6 characters long." 
                    data-val-length-max="30" data-val-length-min="6" 
                    data-val-required="The New password field is required." 
                    id="NewPassword" type="password">
            </div>
            <div class="LabelPassword">
                <label>Confirm Password</label>
                <input data-val="true" data-val-length="The New password must be at least 6 characters long." 
                    data-val-length-max="30" data-val-length-min="6" 
                    data-val-required="The New password field is required." 
                    id="ConfirmPassword" type="password">
            </div>
        </div>
        <input type="submit" value="Set password" />
    </fieldset>
}

虽然很多帖子建议将动作参数重命名为与我的视图模型上的属性不匹配的内容,但我还没有找到解决方法。

enter image description here

奇怪的是,Chrome没有显示的帖子数据。这是我的HTML中的错误还是我对帖子的处理?

最后,这里是行动方法:

[HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> SetPassword(SetPasswordViewModel setPassword)
        {
            if (ModelState.IsValid)
            {
                var result = await UserManager.AddPasswordAsync(User.Identity.GetUserId(), setPassword.NewPassword);
                if (result.Succeeded)
                {
                    var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
                    if (user != null)
                    {
                        await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
                    }
                    return RedirectToAction("Index", new { Message = ManageMessageId.SetPasswordSuccess });
                }
                AddErrors(result);
            }

            // If we got this far, something failed, redisplay form
            return View(setPassword);
        }

我确定它的内容很简单,但我现在没有迹象表明现在出现了问题,除了Chrome中显示的POST空白(好吧,显示了防伪标记)至少)。这是问题吗?

2 个答案:

答案 0 :(得分:0)

您需要将输入的name属性设置为与参数(SetPasswordViewModel)中的属性相同。 Mvc使用名称来映射参数

答案 1 :(得分:0)

确保您的模型名称对象与其任何属性不匹配。示例在控制器操作中传递模型对象。

public class QuestionModel
{ 
  [Required]
  public string Question { get; set; }
)

public ActionResult Index(QuestionModel Question)
{

}

查看上面的示例,其中Question属性与动作控制器中的模型对象名称匹配。