如何为多个页面重用模型的一部分

How to reuse part of model for multiple pages

我有一个现有的 asp.net 核心剃须刀页面,用于记录我们安全团队的事件。他们也想记录失物招领事件,但将它们与安全事件分开保存。我想重用相同的数据库 table 并区分记录 (AppType)。尽管这两个应用程序有很多相似之处,但 Lost and Found 并未使用所有相同的属性(即 L&F 不会使用 SubjectDOB,但在安全模型中需要它。这将导致 (!ModelState.IsValid) 到 return false。仅针对我需要的属性重用 Lost and Found 的 SecurityLog 模型的最佳方法是什么?也许我需要拆分 类?

public class SecurityLog
{        
    public string AppType { get; set; }
    
    [Required]
    [Display(Name = "Subject's First Name")]
    public string SubjectFirst { get; set; }

    [Required]
    [Display(Name = "Subject's Last Name")]
    public string SubjectLast { get; set; }

    [Required]
    [Display(Name = "Subject's B#/DOB")]
    public string SubjectDOB { get; set; }

    [Display(Name = "Entered By")]
    public string EnteredBy { get; set; }
    
    etc...
 }

我试过从模型中删除 subjectDOB 但这不起作用b/c这是必需的。

public async Task<IActionResult> OnPostAsync()
{
     ModelState.Remove("SubjectDOB");                        

     if (!ModelState.IsValid)
     {
        return Page();
     }
}

ModelState.Remove(keyname); 应该按预期工作。请确保密钥名称正确。

这是您可以遵循的示例:

Index.cshtml:

@page
@model IndexModel
<form method="post">
    <input asp-for="SecurityLog.EnteredBy" />
    <input asp-for="SecurityLog.SubjectFirst" />
    <input asp-for="SecurityLog.SubjectLast" />
    <input asp-for="SecurityLog.SubjectDOB" />
    <input type="submit" />
</form>  

Index.cshtml.cs:

public class IndexModel : PageModel
{
    public SecurityLog SecurityLog { get; set; }
    public async Task<IActionResult> OnPostAsync([Bind(Prefix = "SecurityLog")]SecurityLog model)
    {
        ModelState.Remove("SecurityLog.SubjectDOB");

        if (!ModelState.IsValid)
        {
            return Page();
        }
        return Page();
    }
    public async Task<IActionResult> OnGetAsync()
    {
        return Page();
    }
}

抽象可用于将所有基本属性提取到单独的可重用 class。

public class BaseSecurityLog
{        
    public string AppType { get; set; }

    [Required]
    [Display(Name = "Subject's First Name")]
    public string SubjectFirst { get; set; }

    [Required]
    [Display(Name = "Subject's Last Name")]
    public string SubjectLast { get; set; }

    [Display(Name = "Entered By")]
    public string EnteredBy { get; set; }
}

public class SecurityLog : BaseSecurityLog
{
    [Required]
    [Display(Name = "Subject's B#/DOB")]
    public string SubjectDOB { get; set; }
}