如何为多个页面重用模型的一部分
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; }
}
我有一个现有的 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; }
}