查看多个模型并仅发布一个

时间:2016-04-27 18:07:22

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

情况是我有一个复杂的模型,需要查看大量数据,除此之外,控制面板还有密码更改。

将提交另一个属性模型的大型模型。
大型模型中的信息需要加载,POSTing

时不需要

模型

public class ProfileModel {
    // This is the submitted model:
    public PasswordChangeModel Password = new PasswordChangeModel();

    // Personal Info
    public string Name {get; set;}
    public string LastName {get; set;}
    // 15~ more fields
}

密码模型w /验证

public class PasswordChangeModel {
    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "OldPassword")]
    public string OldPassword { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Repeat password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string RepeatPassword { get; set; }
}

控制器捕捉行动

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult ChangePassword(PasswordChangeModel model) {
    if (!ModelState.IsValid) //validate the model
        return View(model);

    //do stuff ...
    return Index();
}

生成表单的Html

<form asp-controller="Profile" asp-action="ChangePassword" asp-antiforgery="true">
    <div asp-validation-summary="ValidationSummary.ModelOnly" class="text-danger"></div>        
    <label asp-for="Password.OldPassword">Old Password</label>
    <input asp-for="Password.OldPassword"/>
    <label asp-for="Password.Password">New Password</label>
    <input asp-for="Password.Password"/>
    <label asp-for="Password.RepeatPassword">New Password Repeat</label>
    <input asp-for="Password.RepeatPassword"/>
    <input type="submit" class="btn" name="submit" value="Change"/>
</form>

问题

现在在审核完代码之后,我的问题是 - 是否有可能以这种方式提交,如果不是最方便,最简洁的方式。

注意:我总是可以在密码更改的模型ProfileModel中包含3个字段,但是A-It很难看,B-It仍然会加载整个ProfileModel数据。

2 个答案:

答案 0 :(得分:0)

我想说最简洁的方法是使用单独的更新密码视图。这或切换到ajax帖子,以便您可以发布而无需重新加载页面。如果你不能制作一个可以在没有重新填充的情况下往服务器进行往返的模型,那么就不要进行标准表格发布。它可以完成,但是当我看到它时,通常在验证错误时重新呈现页面时会出现细微的错误。 在脚下拍摄自己很容易。

答案 1 :(得分:0)

这就是我最终做的事情。 工作得很好。

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult ChangePassword([Bind(Prefix = "Password.OldPassword")]string Password_OldPassword, 
    [Bind(Prefix = "Password.Password")] string Password_Password, 
    [Bind(Prefix = "Password.RepeatPassword")] string Password_RepeatPassword) {
    //Change the password
}

绑定属性将Password.OldPassword的值重定向到Password_OldPassword