如何为关系创建“创建 Razor 视图”?

问题描述 投票:0回答:1

为了给你一些背景信息,我目前正在开发一个 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 方式处理这些关系的任何指导或良好资源,我将非常感激!

感谢您的宝贵时间。

c# asp.net .net asp.net-mvc asp.net-core
1个回答
0
投票

我通常会创建一个视图模型来表示您要编辑的属性,并使用它来创建或更新实体。

例如:

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>
© www.soinside.com 2019 - 2024. All rights reserved.