为了给你一些背景信息,我目前正在开发一个 MVC 项目,我似乎陷入了如何创建一个表单来接收有关人员的信息,如姓名、姓氏等以及用户的信息。信息,用户名..密码。
现在的问题是我已将这两个数据集创建为不同的实体,这意味着存在用户名实体和人员实体。我希望它们都通过同一视图创建。
我真的不知道这是如何制作的。
这些是我制作的相关控制器、模型和视图:
// 人员类别:
public class Persona
{
public int Id { get; set; }
public string Nombre { get; set; }
public string ApellidoPaterno { get; set; }
public string ApellidoMaterno { get; set; }
public string Email { get; set; }
public string Telefono { get; set; }
//Relationship
public int UsuarioId { get; set; }
public Usuario Usuario { get; set; }
}
// 用户类别:
public class Usuario
{
public int Id { get; set; }
public string Username { get; set; }
public string Password { get; set; }
//Relacion
public int PersonaId { get; set; }
public Persona Persona { get; set; }
}
从角色控制器创建:
//POST CREATE
[HttpPost]
public async Task<IActionResult> Create([Bind("Id,Nombre,ApellidoPaterno, ApellidoMaterno, Email, Telefono")] Persona persona)
{
if (ModelState.IsValid)
{
_context.Add(persona);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(persona);
}
及其观点:
@model Persona
<p>Crear nueva Persona</p>
<form asp-controller="Persona" method="post">
<div>
<label asp-for="Nombre">Nombre</label>
<input type="text" asp-for="Nombre">
<span asp-validation-for="Nombre"></span>
</div>
<div>
<label asp-for="ApellidoPaterno">Apellido Paterno</label>
<input type="text" asp-for="ApellidoPaterno">
<span asp-validation-for="ApellidoPaterno"></span>
</div>
<div>
<label asp-for="ApellidoMaterno">Apellido Materno</label>
<input type="text" asp-for="ApellidoMaterno">
<span asp-validation-for="ApellidoMaterno"></span>
</div>
<div>
<label asp-for="Email">Email</label>
<input type="text" asp-for="Email">
<span asp-validation-for="Email"></span>
</div>
<div>
<label asp-for="Telefono">Telefono</label>
<input type="text" asp-for="Telefono">
<span asp-validation-for="Telefono"></span>
</div>
<input type="submit" value="Crear Nuevo">
</form>
过去我使用 ViewData 来在视图中显示另一个实体的某些信息。 但我相信对于这种情况,这不会有帮助,因为我正在尝试在数据库中创建一个新条目。
如果有人知道学习如何以 .NET MVC 方式处理这些关系的任何指导或良好资源,我将非常感激!
感谢您的宝贵时间。
我通常会创建一个视图模型来表示您要编辑的属性,并使用它来创建或更新实体。
例如:
public class PersonaViewModel
{
// For editing an existing record:
public PersonaViewModel(Persona persona)
{
Id = persona.Id;
Nombre = persona.Nombre;
ApellidoPaterno = persona.ApellidoPaterno;
ApellidoMaterno = persona.ApellidoMaterno;
Email = persona.Email;
Telefono = persona.Telefono;
Username = persona.Usuario.Username;
Password = persona.Usuario.Password;
}
// Needed for model binding:
public PersonaViewModel()
{
}
public int Id { get; set; }
public string Nombre { get; set; }
public string ApellidoPaterno { get; set; }
public string ApellidoMaterno { get; set; }
public string Email { get; set; }
public string Telefono { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public void UpdateEntity(Persona persona)
{
persona.Nombre = Nombre;
persona.ApellidoPaterno = ApellidoPaterno;
persona.ApellidoMaterno = ApellidoMaterno;
persona.Email = Email;
persona.Telefono = Telefono;
persona.Usuario ??= new();
persona.Usuario.Username = Username;
persona.Usuario.Password = Password;
}
}
[HttpGet]
public IActionResult Create()
{
PersonaViewModel personaModel = new();
return View(personaModel);
}
[HttpPost]
public async Task<IActionResult> Create(PersonaViewModel personaModel)
{
if (!ModelState.IsValid) return View(personaModel);
Persona persona = new();
personaModel.UpdateEntity(persona);
_context.Persona.Add(persona);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
[HttpGet]
public async Task<IActionResult> Edit(int personaId)
{
Persona persona = await _context.Persona.Include(p => p.Usuario)
.FirstOrDefaultAsync(p => p.Id == personaId);
if (persona is null) return RedirectToAction(nameof(Index));
PersonaViewModel personaModel = new(persona);
return View(personaModel);
}
[HttpPost]
public async Task<IActionResult> Edit(PersonaViewModel personaModel)
{
Persona persona = await _context.Persona.Include(p => p.Usuario)
.FirstOrDefaultAsync(p => p.Id == personaModel.Id);
if (persona is null) return RedirectToAction(nameof(Index));
if (!ModelState.IsValid) return View(personaModel);
personaModel.UpdateEntity(persona);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
@model PersonaViewModel
<p>Crear nueva Persona</p>
<form asp-controller="Persona" method="post">
<!-- Not strictly necessary for creating, but needed for editing: -->
<input type="hidden" asp-for="Id">
<div>
<label asp-for="Nombre">Nombre</label>
<input type="text" asp-for="Nombre">
<span asp-validation-for="Nombre"></span>
</div>
<div>
<label asp-for="ApellidoPaterno">Apellido Paterno</label>
<input type="text" asp-for="ApellidoPaterno">
<span asp-validation-for="ApellidoPaterno"></span>
</div>
<div>
<label asp-for="ApellidoMaterno">Apellido Materno</label>
<input type="text" asp-for="ApellidoMaterno">
<span asp-validation-for="ApellidoMaterno"></span>
</div>
<div>
<label asp-for="Email">Email</label>
<input type="text" asp-for="Email">
<span asp-validation-for="Email"></span>
</div>
<div>
<label asp-for="Telefono">Telefono</label>
<input type="text" asp-for="Telefono">
<span asp-validation-for="Telefono"></span>
</div>
<div>
<label asp-for="Username">Username</label>
<input type="text" asp-for="Username">
<span asp-validation-for="Username"></span>
</div>
<div>
<label asp-for="Password">Password</label>
<input type="text" asp-for="Password">
<span asp-validation-for="Password"></span>
</div>
<input type="submit" value="Crear Nuevo">
</form>