C# 在asp.net core 3中进行模型验证后,错误消息不可见

C# 在asp.net core 3中进行模型验证后,错误消息不可见,c#,validation,asp.net-core,razor,asp.net-core-mvc,C#,Validation,Asp.net Core,Razor,Asp.net Core Mvc,我对模型验证有问题。当ModelState包含错误时,它不会显示任何错误。它将焦点设置为第一个文本框(Firstname),但没有可见的错误消息 模型,CreateSiteUserModel: public interface ICreateSiteUserModel { [Required] Guid SiteUId { get; set; } [Required(AllowEmptyStrings = false, ErrorMessage = "Skriv inn

我对模型验证有问题。当ModelState包含错误时,它不会显示任何错误。它将焦点设置为第一个文本框(Firstname),但没有可见的错误消息

模型,CreateSiteUserModel

public interface ICreateSiteUserModel
{
    [Required]
    Guid SiteUId { get; set; }

    [Required(AllowEmptyStrings = false, ErrorMessage = "Skriv inn fornavn")]
    string Firstname { get; set; }

    [Required(ErrorMessage = "Skriv inn etternavn")]
    string Lastname { get; set; }

    [Required(ErrorMessage = "Skriv inn emailadresse")]
    [EmailAddress]
    string Email { get; set; }

    [Required(ErrorMessage = "Skriv inn passord")]
    [StringLength(30, MinimumLength = 8, ErrorMessage = "Passordet må bestå av minst 8 tegn inkludert minst et tall")]
    string Password { get; set; }
}

public class CreateSiteUserModel : ICreateSiteUserModel
{
    public Guid SiteUId { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
}
public interface ISiteModel
{
    ISiteWrapper Site { get; set; }
    ICreateSiteUserModel SiteUserModel { get; set; }
}

public class SiteModel : ISiteModel
{
    public ISiteWrapper Site { get; set; }
    public ICreateSiteUserModel SiteUserModel { get; set; } = new CreateSiteUserModel();
}
[HttpPost]
public async Task<IActionResult> Site([FromForm] CreateSiteUserModel model)
{
    IActionResult action = default;
    ISite site = await _sites.GetSite(model.SiteUId);

    if (this.ModelState.IsValid)
    {
        IdentityResult result = await _ident.CreateUser(site.Id, model.Email, model.Password);

        if (result.Succeeded)
        {
            IUser user = await this.DB.GetWorker<User>().Latest();

            action = RedirectToAction("EditSiteUser", "Identity", new { UId = user.UId });
        }
    }
    else
    {
        ISiteModel mdl = new SiteModel() { Site = new SiteWrapper(site, this.DB), SiteUserModel = model };

        action = View(mdl);
    }

    return action;
}
@model ISiteModel

<form method="post">
    <table style="width:100%;">
        <tr>
            <td style="width:140px;">
                <label asp-for="SiteUserModel.Firstname"></label>
            </td>
            <td>
                <input id="firstname" name="firstname" type="text" class="txt-light" asp-for="SiteUserModel.Firstname" />
                <span class="error-msg color-danger" asp-validation-for="SiteUserModel.Firstname"></span>
            </td>
        </tr>
        <tr>
            <td>Etternavn</td>
            <td>
                <input id="lastname" name="lastname" type="text" class="txt-light lastname" />
            </td>
        </tr>
        <tr>
            <td>Email</td>
            <td>
                <input id="email" name="email" type="email" class="txt-light email" />
            </td>
        </tr>
        <tr>
            <td>Passord</td>
            <td>
                <input id="password" name="password" type="text" class="txt-light password" />
            </td>
        </tr>
        <tr>
            <td></td>
            <td class="pad-md">
                <input id="siteUId" name="siteUId" type="hidden" value="@site.UId" />
                <input type="submit" class="btn-dark" value="Lagre" formmethod="post" />
            </td>
        </tr>
    </table>
</form>
<form method="post" novalidate="novalidate">
    <table style="width:100%;">
        <tbody>
            <tr>
                <td style="width:140px;">
                    <label for="SiteUserModel_Firstname">Firstname</label>
                </td>
                <td>
                    <input id="firstname" name="firstname" type="text" class="txt-light firstname input-validation-error" data-val="true" data-val-required="Skriv inn fornavn" value="" aria-describedby="firstname-error" aria-invalid="true">
                    <span class="error-msg color-danger field-validation-valid" data-valmsg-for="SiteUserModel.Firstname" data-valmsg-replace="true"></span>
                </td>
            </tr>
            <tr>
                <td>Etternavn</td>
                <td>
                    <input id="lastname" name="lastname" type="text" class="txt-light lastname">
                </td>
            </tr>
            <tr>
                <td>Email</td>
                <td>
                    <input id="email" name="email" type="email" class="txt-light email valid">
                </td>
            </tr>
            <tr>
                <td>Passord</td>
                <td>
                    <input id="password" name="password" type="text" class="txt-light password">
                </td>
            </tr>
            <tr>
                <td></td>
                <td class="pad-md">
                    <input id="siteUId" name="siteUId" type="hidden" value="62e8a8b1-72be-4f71-b2e6-9dce89fcde76">
                    <input type="submit" class="btn-dark" value="Lagre" formmethod="post">
                </td>
            </tr>
        </tbody>
    </table>
    <input name="__RequestVerificationToken" type="hidden" value="CfDJ8JxeOiw3r2BBtI-MX6Hqs7u_pj2MJEQMl0kZvyoVW0CicaRoZns_U7UnOIrDe0ADt2mVHvxhOPagANjX4C0QupCPvRaKyz8YRnwOaK64gNIisfzv1ii_HRMrXS2Hpd_L9bHm6ypzgyyE-v7029xP_kg">
</form>
<tr>
    <td style="width:140px;">
        <label asp-for="SiteUserModel.Firstname"></label>
    </td>
    <td>
        <input type="text" class="txt-light firstname" asp-for="SiteUserModel.Firstname" />
        <span class="error-msg color-danger" asp-validation-for="SiteUserModel.Firstname"></span>
    </td>
</tr>
模型,站点模型

public interface ICreateSiteUserModel
{
    [Required]
    Guid SiteUId { get; set; }

    [Required(AllowEmptyStrings = false, ErrorMessage = "Skriv inn fornavn")]
    string Firstname { get; set; }

    [Required(ErrorMessage = "Skriv inn etternavn")]
    string Lastname { get; set; }

    [Required(ErrorMessage = "Skriv inn emailadresse")]
    [EmailAddress]
    string Email { get; set; }

    [Required(ErrorMessage = "Skriv inn passord")]
    [StringLength(30, MinimumLength = 8, ErrorMessage = "Passordet må bestå av minst 8 tegn inkludert minst et tall")]
    string Password { get; set; }
}

public class CreateSiteUserModel : ICreateSiteUserModel
{
    public Guid SiteUId { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
}
public interface ISiteModel
{
    ISiteWrapper Site { get; set; }
    ICreateSiteUserModel SiteUserModel { get; set; }
}

public class SiteModel : ISiteModel
{
    public ISiteWrapper Site { get; set; }
    public ICreateSiteUserModel SiteUserModel { get; set; } = new CreateSiteUserModel();
}
[HttpPost]
public async Task<IActionResult> Site([FromForm] CreateSiteUserModel model)
{
    IActionResult action = default;
    ISite site = await _sites.GetSite(model.SiteUId);

    if (this.ModelState.IsValid)
    {
        IdentityResult result = await _ident.CreateUser(site.Id, model.Email, model.Password);

        if (result.Succeeded)
        {
            IUser user = await this.DB.GetWorker<User>().Latest();

            action = RedirectToAction("EditSiteUser", "Identity", new { UId = user.UId });
        }
    }
    else
    {
        ISiteModel mdl = new SiteModel() { Site = new SiteWrapper(site, this.DB), SiteUserModel = model };

        action = View(mdl);
    }

    return action;
}
@model ISiteModel

<form method="post">
    <table style="width:100%;">
        <tr>
            <td style="width:140px;">
                <label asp-for="SiteUserModel.Firstname"></label>
            </td>
            <td>
                <input id="firstname" name="firstname" type="text" class="txt-light" asp-for="SiteUserModel.Firstname" />
                <span class="error-msg color-danger" asp-validation-for="SiteUserModel.Firstname"></span>
            </td>
        </tr>
        <tr>
            <td>Etternavn</td>
            <td>
                <input id="lastname" name="lastname" type="text" class="txt-light lastname" />
            </td>
        </tr>
        <tr>
            <td>Email</td>
            <td>
                <input id="email" name="email" type="email" class="txt-light email" />
            </td>
        </tr>
        <tr>
            <td>Passord</td>
            <td>
                <input id="password" name="password" type="text" class="txt-light password" />
            </td>
        </tr>
        <tr>
            <td></td>
            <td class="pad-md">
                <input id="siteUId" name="siteUId" type="hidden" value="@site.UId" />
                <input type="submit" class="btn-dark" value="Lagre" formmethod="post" />
            </td>
        </tr>
    </table>
</form>
<form method="post" novalidate="novalidate">
    <table style="width:100%;">
        <tbody>
            <tr>
                <td style="width:140px;">
                    <label for="SiteUserModel_Firstname">Firstname</label>
                </td>
                <td>
                    <input id="firstname" name="firstname" type="text" class="txt-light firstname input-validation-error" data-val="true" data-val-required="Skriv inn fornavn" value="" aria-describedby="firstname-error" aria-invalid="true">
                    <span class="error-msg color-danger field-validation-valid" data-valmsg-for="SiteUserModel.Firstname" data-valmsg-replace="true"></span>
                </td>
            </tr>
            <tr>
                <td>Etternavn</td>
                <td>
                    <input id="lastname" name="lastname" type="text" class="txt-light lastname">
                </td>
            </tr>
            <tr>
                <td>Email</td>
                <td>
                    <input id="email" name="email" type="email" class="txt-light email valid">
                </td>
            </tr>
            <tr>
                <td>Passord</td>
                <td>
                    <input id="password" name="password" type="text" class="txt-light password">
                </td>
            </tr>
            <tr>
                <td></td>
                <td class="pad-md">
                    <input id="siteUId" name="siteUId" type="hidden" value="62e8a8b1-72be-4f71-b2e6-9dce89fcde76">
                    <input type="submit" class="btn-dark" value="Lagre" formmethod="post">
                </td>
            </tr>
        </tbody>
    </table>
    <input name="__RequestVerificationToken" type="hidden" value="CfDJ8JxeOiw3r2BBtI-MX6Hqs7u_pj2MJEQMl0kZvyoVW0CicaRoZns_U7UnOIrDe0ADt2mVHvxhOPagANjX4C0QupCPvRaKyz8YRnwOaK64gNIisfzv1ii_HRMrXS2Hpd_L9bHm6ypzgyyE-v7029xP_kg">
</form>
<tr>
    <td style="width:140px;">
        <label asp-for="SiteUserModel.Firstname"></label>
    </td>
    <td>
        <input type="text" class="txt-light firstname" asp-for="SiteUserModel.Firstname" />
        <span class="error-msg color-danger" asp-validation-for="SiteUserModel.Firstname"></span>
    </td>
</tr>
控制器

public interface ICreateSiteUserModel
{
    [Required]
    Guid SiteUId { get; set; }

    [Required(AllowEmptyStrings = false, ErrorMessage = "Skriv inn fornavn")]
    string Firstname { get; set; }

    [Required(ErrorMessage = "Skriv inn etternavn")]
    string Lastname { get; set; }

    [Required(ErrorMessage = "Skriv inn emailadresse")]
    [EmailAddress]
    string Email { get; set; }

    [Required(ErrorMessage = "Skriv inn passord")]
    [StringLength(30, MinimumLength = 8, ErrorMessage = "Passordet må bestå av minst 8 tegn inkludert minst et tall")]
    string Password { get; set; }
}

public class CreateSiteUserModel : ICreateSiteUserModel
{
    public Guid SiteUId { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
}
public interface ISiteModel
{
    ISiteWrapper Site { get; set; }
    ICreateSiteUserModel SiteUserModel { get; set; }
}

public class SiteModel : ISiteModel
{
    public ISiteWrapper Site { get; set; }
    public ICreateSiteUserModel SiteUserModel { get; set; } = new CreateSiteUserModel();
}
[HttpPost]
public async Task<IActionResult> Site([FromForm] CreateSiteUserModel model)
{
    IActionResult action = default;
    ISite site = await _sites.GetSite(model.SiteUId);

    if (this.ModelState.IsValid)
    {
        IdentityResult result = await _ident.CreateUser(site.Id, model.Email, model.Password);

        if (result.Succeeded)
        {
            IUser user = await this.DB.GetWorker<User>().Latest();

            action = RedirectToAction("EditSiteUser", "Identity", new { UId = user.UId });
        }
    }
    else
    {
        ISiteModel mdl = new SiteModel() { Site = new SiteWrapper(site, this.DB), SiteUserModel = model };

        action = View(mdl);
    }

    return action;
}
@model ISiteModel

<form method="post">
    <table style="width:100%;">
        <tr>
            <td style="width:140px;">
                <label asp-for="SiteUserModel.Firstname"></label>
            </td>
            <td>
                <input id="firstname" name="firstname" type="text" class="txt-light" asp-for="SiteUserModel.Firstname" />
                <span class="error-msg color-danger" asp-validation-for="SiteUserModel.Firstname"></span>
            </td>
        </tr>
        <tr>
            <td>Etternavn</td>
            <td>
                <input id="lastname" name="lastname" type="text" class="txt-light lastname" />
            </td>
        </tr>
        <tr>
            <td>Email</td>
            <td>
                <input id="email" name="email" type="email" class="txt-light email" />
            </td>
        </tr>
        <tr>
            <td>Passord</td>
            <td>
                <input id="password" name="password" type="text" class="txt-light password" />
            </td>
        </tr>
        <tr>
            <td></td>
            <td class="pad-md">
                <input id="siteUId" name="siteUId" type="hidden" value="@site.UId" />
                <input type="submit" class="btn-dark" value="Lagre" formmethod="post" />
            </td>
        </tr>
    </table>
</form>
<form method="post" novalidate="novalidate">
    <table style="width:100%;">
        <tbody>
            <tr>
                <td style="width:140px;">
                    <label for="SiteUserModel_Firstname">Firstname</label>
                </td>
                <td>
                    <input id="firstname" name="firstname" type="text" class="txt-light firstname input-validation-error" data-val="true" data-val-required="Skriv inn fornavn" value="" aria-describedby="firstname-error" aria-invalid="true">
                    <span class="error-msg color-danger field-validation-valid" data-valmsg-for="SiteUserModel.Firstname" data-valmsg-replace="true"></span>
                </td>
            </tr>
            <tr>
                <td>Etternavn</td>
                <td>
                    <input id="lastname" name="lastname" type="text" class="txt-light lastname">
                </td>
            </tr>
            <tr>
                <td>Email</td>
                <td>
                    <input id="email" name="email" type="email" class="txt-light email valid">
                </td>
            </tr>
            <tr>
                <td>Passord</td>
                <td>
                    <input id="password" name="password" type="text" class="txt-light password">
                </td>
            </tr>
            <tr>
                <td></td>
                <td class="pad-md">
                    <input id="siteUId" name="siteUId" type="hidden" value="62e8a8b1-72be-4f71-b2e6-9dce89fcde76">
                    <input type="submit" class="btn-dark" value="Lagre" formmethod="post">
                </td>
            </tr>
        </tbody>
    </table>
    <input name="__RequestVerificationToken" type="hidden" value="CfDJ8JxeOiw3r2BBtI-MX6Hqs7u_pj2MJEQMl0kZvyoVW0CicaRoZns_U7UnOIrDe0ADt2mVHvxhOPagANjX4C0QupCPvRaKyz8YRnwOaK64gNIisfzv1ii_HRMrXS2Hpd_L9bHm6ypzgyyE-v7029xP_kg">
</form>
<tr>
    <td style="width:140px;">
        <label asp-for="SiteUserModel.Firstname"></label>
    </td>
    <td>
        <input type="text" class="txt-light firstname" asp-for="SiteUserModel.Firstname" />
        <span class="error-msg color-danger" asp-validation-for="SiteUserModel.Firstname"></span>
    </td>
</tr>
[HttpPost]
公共异步任务站点([FromForm]CreateSiteUserModel模型)
{
IActionResult action=默认值;
ISite site=wait_sites.GetSite(model.SiteUId);
if(this.ModelState.IsValid)
{
IdentityResult result=wait_ident.CreateUser(site.Id、model.Email、model.Password);
if(result.successed)
{
IUser user=wait this.DB.GetWorker().Latest();
action=RedirectToAction(“EditSiteUser”,“Identity”,new{UId=user.UId});
}
}
其他的
{
ISiteModel mdl=new SiteModel(){Site=new SiteWrapper(Site,this.DB),SiteUserModel=model};
动作=视图(mdl);
}
返回动作;
}
CSHTML

public interface ICreateSiteUserModel
{
    [Required]
    Guid SiteUId { get; set; }

    [Required(AllowEmptyStrings = false, ErrorMessage = "Skriv inn fornavn")]
    string Firstname { get; set; }

    [Required(ErrorMessage = "Skriv inn etternavn")]
    string Lastname { get; set; }

    [Required(ErrorMessage = "Skriv inn emailadresse")]
    [EmailAddress]
    string Email { get; set; }

    [Required(ErrorMessage = "Skriv inn passord")]
    [StringLength(30, MinimumLength = 8, ErrorMessage = "Passordet må bestå av minst 8 tegn inkludert minst et tall")]
    string Password { get; set; }
}

public class CreateSiteUserModel : ICreateSiteUserModel
{
    public Guid SiteUId { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
}
public interface ISiteModel
{
    ISiteWrapper Site { get; set; }
    ICreateSiteUserModel SiteUserModel { get; set; }
}

public class SiteModel : ISiteModel
{
    public ISiteWrapper Site { get; set; }
    public ICreateSiteUserModel SiteUserModel { get; set; } = new CreateSiteUserModel();
}
[HttpPost]
public async Task<IActionResult> Site([FromForm] CreateSiteUserModel model)
{
    IActionResult action = default;
    ISite site = await _sites.GetSite(model.SiteUId);

    if (this.ModelState.IsValid)
    {
        IdentityResult result = await _ident.CreateUser(site.Id, model.Email, model.Password);

        if (result.Succeeded)
        {
            IUser user = await this.DB.GetWorker<User>().Latest();

            action = RedirectToAction("EditSiteUser", "Identity", new { UId = user.UId });
        }
    }
    else
    {
        ISiteModel mdl = new SiteModel() { Site = new SiteWrapper(site, this.DB), SiteUserModel = model };

        action = View(mdl);
    }

    return action;
}
@model ISiteModel

<form method="post">
    <table style="width:100%;">
        <tr>
            <td style="width:140px;">
                <label asp-for="SiteUserModel.Firstname"></label>
            </td>
            <td>
                <input id="firstname" name="firstname" type="text" class="txt-light" asp-for="SiteUserModel.Firstname" />
                <span class="error-msg color-danger" asp-validation-for="SiteUserModel.Firstname"></span>
            </td>
        </tr>
        <tr>
            <td>Etternavn</td>
            <td>
                <input id="lastname" name="lastname" type="text" class="txt-light lastname" />
            </td>
        </tr>
        <tr>
            <td>Email</td>
            <td>
                <input id="email" name="email" type="email" class="txt-light email" />
            </td>
        </tr>
        <tr>
            <td>Passord</td>
            <td>
                <input id="password" name="password" type="text" class="txt-light password" />
            </td>
        </tr>
        <tr>
            <td></td>
            <td class="pad-md">
                <input id="siteUId" name="siteUId" type="hidden" value="@site.UId" />
                <input type="submit" class="btn-dark" value="Lagre" formmethod="post" />
            </td>
        </tr>
    </table>
</form>
<form method="post" novalidate="novalidate">
    <table style="width:100%;">
        <tbody>
            <tr>
                <td style="width:140px;">
                    <label for="SiteUserModel_Firstname">Firstname</label>
                </td>
                <td>
                    <input id="firstname" name="firstname" type="text" class="txt-light firstname input-validation-error" data-val="true" data-val-required="Skriv inn fornavn" value="" aria-describedby="firstname-error" aria-invalid="true">
                    <span class="error-msg color-danger field-validation-valid" data-valmsg-for="SiteUserModel.Firstname" data-valmsg-replace="true"></span>
                </td>
            </tr>
            <tr>
                <td>Etternavn</td>
                <td>
                    <input id="lastname" name="lastname" type="text" class="txt-light lastname">
                </td>
            </tr>
            <tr>
                <td>Email</td>
                <td>
                    <input id="email" name="email" type="email" class="txt-light email valid">
                </td>
            </tr>
            <tr>
                <td>Passord</td>
                <td>
                    <input id="password" name="password" type="text" class="txt-light password">
                </td>
            </tr>
            <tr>
                <td></td>
                <td class="pad-md">
                    <input id="siteUId" name="siteUId" type="hidden" value="62e8a8b1-72be-4f71-b2e6-9dce89fcde76">
                    <input type="submit" class="btn-dark" value="Lagre" formmethod="post">
                </td>
            </tr>
        </tbody>
    </table>
    <input name="__RequestVerificationToken" type="hidden" value="CfDJ8JxeOiw3r2BBtI-MX6Hqs7u_pj2MJEQMl0kZvyoVW0CicaRoZns_U7UnOIrDe0ADt2mVHvxhOPagANjX4C0QupCPvRaKyz8YRnwOaK64gNIisfzv1ii_HRMrXS2Hpd_L9bHm6ypzgyyE-v7029xP_kg">
</form>
<tr>
    <td style="width:140px;">
        <label asp-for="SiteUserModel.Firstname"></label>
    </td>
    <td>
        <input type="text" class="txt-light firstname" asp-for="SiteUserModel.Firstname" />
        <span class="error-msg color-danger" asp-validation-for="SiteUserModel.Firstname"></span>
    </td>
</tr>
@model-ISiteModel
艾特纳夫
电子邮件
口令
提交后的HTML

public interface ICreateSiteUserModel
{
    [Required]
    Guid SiteUId { get; set; }

    [Required(AllowEmptyStrings = false, ErrorMessage = "Skriv inn fornavn")]
    string Firstname { get; set; }

    [Required(ErrorMessage = "Skriv inn etternavn")]
    string Lastname { get; set; }

    [Required(ErrorMessage = "Skriv inn emailadresse")]
    [EmailAddress]
    string Email { get; set; }

    [Required(ErrorMessage = "Skriv inn passord")]
    [StringLength(30, MinimumLength = 8, ErrorMessage = "Passordet må bestå av minst 8 tegn inkludert minst et tall")]
    string Password { get; set; }
}

public class CreateSiteUserModel : ICreateSiteUserModel
{
    public Guid SiteUId { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
}
public interface ISiteModel
{
    ISiteWrapper Site { get; set; }
    ICreateSiteUserModel SiteUserModel { get; set; }
}

public class SiteModel : ISiteModel
{
    public ISiteWrapper Site { get; set; }
    public ICreateSiteUserModel SiteUserModel { get; set; } = new CreateSiteUserModel();
}
[HttpPost]
public async Task<IActionResult> Site([FromForm] CreateSiteUserModel model)
{
    IActionResult action = default;
    ISite site = await _sites.GetSite(model.SiteUId);

    if (this.ModelState.IsValid)
    {
        IdentityResult result = await _ident.CreateUser(site.Id, model.Email, model.Password);

        if (result.Succeeded)
        {
            IUser user = await this.DB.GetWorker<User>().Latest();

            action = RedirectToAction("EditSiteUser", "Identity", new { UId = user.UId });
        }
    }
    else
    {
        ISiteModel mdl = new SiteModel() { Site = new SiteWrapper(site, this.DB), SiteUserModel = model };

        action = View(mdl);
    }

    return action;
}
@model ISiteModel

<form method="post">
    <table style="width:100%;">
        <tr>
            <td style="width:140px;">
                <label asp-for="SiteUserModel.Firstname"></label>
            </td>
            <td>
                <input id="firstname" name="firstname" type="text" class="txt-light" asp-for="SiteUserModel.Firstname" />
                <span class="error-msg color-danger" asp-validation-for="SiteUserModel.Firstname"></span>
            </td>
        </tr>
        <tr>
            <td>Etternavn</td>
            <td>
                <input id="lastname" name="lastname" type="text" class="txt-light lastname" />
            </td>
        </tr>
        <tr>
            <td>Email</td>
            <td>
                <input id="email" name="email" type="email" class="txt-light email" />
            </td>
        </tr>
        <tr>
            <td>Passord</td>
            <td>
                <input id="password" name="password" type="text" class="txt-light password" />
            </td>
        </tr>
        <tr>
            <td></td>
            <td class="pad-md">
                <input id="siteUId" name="siteUId" type="hidden" value="@site.UId" />
                <input type="submit" class="btn-dark" value="Lagre" formmethod="post" />
            </td>
        </tr>
    </table>
</form>
<form method="post" novalidate="novalidate">
    <table style="width:100%;">
        <tbody>
            <tr>
                <td style="width:140px;">
                    <label for="SiteUserModel_Firstname">Firstname</label>
                </td>
                <td>
                    <input id="firstname" name="firstname" type="text" class="txt-light firstname input-validation-error" data-val="true" data-val-required="Skriv inn fornavn" value="" aria-describedby="firstname-error" aria-invalid="true">
                    <span class="error-msg color-danger field-validation-valid" data-valmsg-for="SiteUserModel.Firstname" data-valmsg-replace="true"></span>
                </td>
            </tr>
            <tr>
                <td>Etternavn</td>
                <td>
                    <input id="lastname" name="lastname" type="text" class="txt-light lastname">
                </td>
            </tr>
            <tr>
                <td>Email</td>
                <td>
                    <input id="email" name="email" type="email" class="txt-light email valid">
                </td>
            </tr>
            <tr>
                <td>Passord</td>
                <td>
                    <input id="password" name="password" type="text" class="txt-light password">
                </td>
            </tr>
            <tr>
                <td></td>
                <td class="pad-md">
                    <input id="siteUId" name="siteUId" type="hidden" value="62e8a8b1-72be-4f71-b2e6-9dce89fcde76">
                    <input type="submit" class="btn-dark" value="Lagre" formmethod="post">
                </td>
            </tr>
        </tbody>
    </table>
    <input name="__RequestVerificationToken" type="hidden" value="CfDJ8JxeOiw3r2BBtI-MX6Hqs7u_pj2MJEQMl0kZvyoVW0CicaRoZns_U7UnOIrDe0ADt2mVHvxhOPagANjX4C0QupCPvRaKyz8YRnwOaK64gNIisfzv1ii_HRMrXS2Hpd_L9bHm6ypzgyyE-v7029xP_kg">
</form>
<tr>
    <td style="width:140px;">
        <label asp-for="SiteUserModel.Firstname"></label>
    </td>
    <td>
        <input type="text" class="txt-light firstname" asp-for="SiteUserModel.Firstname" />
        <span class="error-msg color-danger" asp-validation-for="SiteUserModel.Firstname"></span>
    </td>
</tr>

名字
艾特纳夫
电子邮件
口令

正如@KirkLarkin建议的那样:删除Id和Name属性-让助手生成值

HTML

public interface ICreateSiteUserModel
{
    [Required]
    Guid SiteUId { get; set; }

    [Required(AllowEmptyStrings = false, ErrorMessage = "Skriv inn fornavn")]
    string Firstname { get; set; }

    [Required(ErrorMessage = "Skriv inn etternavn")]
    string Lastname { get; set; }

    [Required(ErrorMessage = "Skriv inn emailadresse")]
    [EmailAddress]
    string Email { get; set; }

    [Required(ErrorMessage = "Skriv inn passord")]
    [StringLength(30, MinimumLength = 8, ErrorMessage = "Passordet må bestå av minst 8 tegn inkludert minst et tall")]
    string Password { get; set; }
}

public class CreateSiteUserModel : ICreateSiteUserModel
{
    public Guid SiteUId { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
}
public interface ISiteModel
{
    ISiteWrapper Site { get; set; }
    ICreateSiteUserModel SiteUserModel { get; set; }
}

public class SiteModel : ISiteModel
{
    public ISiteWrapper Site { get; set; }
    public ICreateSiteUserModel SiteUserModel { get; set; } = new CreateSiteUserModel();
}
[HttpPost]
public async Task<IActionResult> Site([FromForm] CreateSiteUserModel model)
{
    IActionResult action = default;
    ISite site = await _sites.GetSite(model.SiteUId);

    if (this.ModelState.IsValid)
    {
        IdentityResult result = await _ident.CreateUser(site.Id, model.Email, model.Password);

        if (result.Succeeded)
        {
            IUser user = await this.DB.GetWorker<User>().Latest();

            action = RedirectToAction("EditSiteUser", "Identity", new { UId = user.UId });
        }
    }
    else
    {
        ISiteModel mdl = new SiteModel() { Site = new SiteWrapper(site, this.DB), SiteUserModel = model };

        action = View(mdl);
    }

    return action;
}
@model ISiteModel

<form method="post">
    <table style="width:100%;">
        <tr>
            <td style="width:140px;">
                <label asp-for="SiteUserModel.Firstname"></label>
            </td>
            <td>
                <input id="firstname" name="firstname" type="text" class="txt-light" asp-for="SiteUserModel.Firstname" />
                <span class="error-msg color-danger" asp-validation-for="SiteUserModel.Firstname"></span>
            </td>
        </tr>
        <tr>
            <td>Etternavn</td>
            <td>
                <input id="lastname" name="lastname" type="text" class="txt-light lastname" />
            </td>
        </tr>
        <tr>
            <td>Email</td>
            <td>
                <input id="email" name="email" type="email" class="txt-light email" />
            </td>
        </tr>
        <tr>
            <td>Passord</td>
            <td>
                <input id="password" name="password" type="text" class="txt-light password" />
            </td>
        </tr>
        <tr>
            <td></td>
            <td class="pad-md">
                <input id="siteUId" name="siteUId" type="hidden" value="@site.UId" />
                <input type="submit" class="btn-dark" value="Lagre" formmethod="post" />
            </td>
        </tr>
    </table>
</form>
<form method="post" novalidate="novalidate">
    <table style="width:100%;">
        <tbody>
            <tr>
                <td style="width:140px;">
                    <label for="SiteUserModel_Firstname">Firstname</label>
                </td>
                <td>
                    <input id="firstname" name="firstname" type="text" class="txt-light firstname input-validation-error" data-val="true" data-val-required="Skriv inn fornavn" value="" aria-describedby="firstname-error" aria-invalid="true">
                    <span class="error-msg color-danger field-validation-valid" data-valmsg-for="SiteUserModel.Firstname" data-valmsg-replace="true"></span>
                </td>
            </tr>
            <tr>
                <td>Etternavn</td>
                <td>
                    <input id="lastname" name="lastname" type="text" class="txt-light lastname">
                </td>
            </tr>
            <tr>
                <td>Email</td>
                <td>
                    <input id="email" name="email" type="email" class="txt-light email valid">
                </td>
            </tr>
            <tr>
                <td>Passord</td>
                <td>
                    <input id="password" name="password" type="text" class="txt-light password">
                </td>
            </tr>
            <tr>
                <td></td>
                <td class="pad-md">
                    <input id="siteUId" name="siteUId" type="hidden" value="62e8a8b1-72be-4f71-b2e6-9dce89fcde76">
                    <input type="submit" class="btn-dark" value="Lagre" formmethod="post">
                </td>
            </tr>
        </tbody>
    </table>
    <input name="__RequestVerificationToken" type="hidden" value="CfDJ8JxeOiw3r2BBtI-MX6Hqs7u_pj2MJEQMl0kZvyoVW0CicaRoZns_U7UnOIrDe0ADt2mVHvxhOPagANjX4C0QupCPvRaKyz8YRnwOaK64gNIisfzv1ii_HRMrXS2Hpd_L9bHm6ypzgyyE-v7029xP_kg">
</form>
<tr>
    <td style="width:140px;">
        <label asp-for="SiteUserModel.Firstname"></label>
    </td>
    <td>
        <input type="text" class="txt-light firstname" asp-for="SiteUserModel.Firstname" />
        <span class="error-msg color-danger" asp-validation-for="SiteUserModel.Firstname"></span>
    </td>
</tr>


我认为这是因为您为输入指定了
id
name
属性。通过使用asp for,这些覆盖了一的设置-只需使用生成的设置。@KirkLarkin是的,你是对的-删除了id和名称,它就工作了。谢谢别担心。您可以在呈现的HTML中看到问题。您将
name
设置为
firstname
,但是
data-valmsg for
等用于
SiteUserModel.firstname
。这些不匹配,因此验证消息不知道该做什么。