文本字段名称不正确,来自视图Asp.net MVC中的viewModel

时间:2019-04-20 03:34:10

标签: c# asp.net-mvc

我在文本字段中使用viewModel,但是模型字段的名称在浏览器viewsource中不是实际的。在浏览器viewsource中,它显示具有viewmodel名称的模型字段名称,例如 name =“ ResetPasswordModel.NewPassword” ,并且字段id也显示为名称,因此我该如何解决。我已添加浏览器viewsource代码和实际代码,请对其进行检查。我希望你能理解我的问题,谢谢。

ViewModel

public class ProductViewModel
{
    public User UserDetails { get; set; }        
    public ResetPasswordModel ResetPasswordModel { get; set; }
}

public class ResetPasswordModel
{
  public string CurrentPassword{ get; set; }
  public string NewPassword { get; set; }

}

查看

@model ProjectName.Models.ProductViewModel

    @using (Html.BeginForm("ActionName", "Controller", FormMethod.Post))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    @Html.HiddenFor(model => model.UserDetails.UserID)
    <div class="row">
        <div class="col-sm-6">
            <div class="form-group">
                <label class="control-label">Current Password</label>
                @Html.TextBoxFor(model => model.ResetPasswordModel.CurrentPassword, new { @class = "form-control", placeholder = "Current Password" })
                @Html.ValidationMessageFor(model => model.ResetPasswordModel.CurrentPassword, "", new { @class = "text-danger" })

            </div>
        </div>
        <div class="col-sm-6">
            <div class="form-group">
                <label class="control-label">New Password</label>
                @Html.TextBoxFor(model => model.ResetPasswordModel.NewPassword, new { @class = "form-control", placeholder = "New Password" })
                @Html.ValidationMessageFor(model => model.ResetPasswordModel.NewPassword, "", new { @class = "text-danger" })
            </div>
        </div>
    </div>
}

浏览器查看源

您可以看到他们没有正确显示模型字段名称

<div class="col-sm-6">
    <div class="form-group">
        <label class="control-label">Current Password</label>
        <input class="form-control" name="ResetPasswordModel.CurrentPassword" placeholder="Current Password" data-val="true" data-val-required="The Current Password field is required." id="ResetPasswordModel_CurrentPassword"  type="text" value="" />
        <span class="field-validation-valid text-danger" data-valmsg-for="ResetPasswordModel.CurrentPassword" data-valmsg-replace="true"></span>

    </div>
</div>
<div class="col-sm-6">
    <div class="form-group">
        <label class="control-label">New Password</label>
        <input class="form-control" name="ResetPasswordModel.NewPassword" 
placeholder="New Password" id="ResetPasswordModel_NewPassword" type="text"  data-val="true" data-val-maxlength="Maxmimum 40 characters allowed" data-val-maxlength-max="40" data-val-minlength="Minimum 8 characters required for password" data-val-minlength-min="8" data-val-required="The Password field is required"  value="" />
        <span class="field-validation-valid text-danger" data-valmsg-for="ResetPasswordModel.NewPassword" data-valmsg-replace="true"></span>
    </div>
</div>

控制器

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult ActionName(ResetPasswordModel ResetPass)
    {
        if (ModelState.IsValid)
        {

        }
        return View();
    }

2 个答案:

答案 0 :(得分:1)

问题是,在“视图”中,模型为:ProductViewModel,但在控制器中,您期望的是:ResetPasswordModel

这是不对的,请更改控制器以接受:ProductViewModel

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ActionName(ProductViewModel productViewModel)
{
    if (ModelState.IsValid)
    {

    }
    return View();
}

在这种情况下,名称为= ResetPasswordModel.NewPassword的输入将正确绑定到您的模型。

或在您的视图中更改模型:

@model ResetPasswordModel

@using (Html.BeginForm("ActionName", "Controller", FormMethod.Post))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    @Html.HiddenFor(model => model.UserDetails.UserID)
    <div class="row">
        <div class="col-sm-6">
            <div class="form-group">
                <label class="control-label">Current Password</label>
                @Html.TextBoxFor(model => model.CurrentPassword, new { @class = "form-control", placeholder = "Current Password" })
                @Html.ValidationMessageFor(model => model.CurrentPassword, "", new { @class = "text-danger" })
            </div>
        </div>
        <div class="col-sm-6">
            <div class="form-group">
                <label class="control-label">New Password</label>
                @Html.TextBoxFor(model => model.NewPassword, new { @class = "form-control", placeholder = "New Password" })
                @Html.ValidationMessageFor(model => model.NewPassword, "", new { @class = "text-danger" })
            </div>
        </div>
    </div>
}

在这种情况下,输入名称为:NewPassword

答案 1 :(得分:0)

您可以这样设置name属性:

@Html.TextBoxFor(model => model.ResetPasswordModel.NewPassword, new { @class = "form-control", placeholder = "New Password" , Name="NewPassword"})