Proste forum, garść pytań.

0

Robie proste forum składające się z warstwy API (mvc) gdzie zostało dodane połączenie z bazą danych oraz z warstwy UI (razor pages). Mam kilka gotowych klas (modeli) dla użytkownika, wiadomości, wątków forumowych i dodałem model rejestracji użytkownika, muszę też zaimplementować zainteresowania użytkownika, żeby mógł je dodawać , zmieniać usuwać, czyli jakiś tam crud do tego. Jednak przy rejestracji musze zaimplementować możliwość dodania kilku zainteresowań. Teraz nie bardzo wiem jak to zrobić. Na myśl przychodzi mi zrobienie czegoś takiego jak np. jest na YT z tagami, że po każdym słowie i postawieniu przecinka słowo zamienia się w osobnego stringa, taga. I potem np. dodać to do bazy danych jako liste. Jakbyście coś takiego zaimplementowali?

screenshot-20220405214248.png

0

Możesz z widoku wysłać normalną List<T> np. List<string> do controllera wewnątrz RegistrationModelu

e.g

public class Vm
{
    public List<string> List { get; set; } = new List<string>();
}

[HttpPost]
public IActionResult Index([FromForm] Vm vm)
{
    return View();
}

<form asp-action="Index" method="post">
  <input type="text" name="List" value="a" />
  <input type="text" name="List" value="b" />
  <input type="text" name="List" value="c" />
  <button type="submit">send</button>
</form>

screenshot-20220406003530.png

0

Dzięki za odpowiedź. Powiedzmy, że przypisze po prostu różne zainteresowania do Listy List<InterestModel> z widoku, domyślam się jak to zrobić, ale jest problem z samym OnPost bo Model.isValid jest ciągle false. Nowy użytknownik "User" jest null mimo że binduje mu propertisy.


namespace Fora.UI.Pages
{
    [BindProperties]
    public class SignupModel : PageModel
    {
        private readonly AppDbContext _context;
        private readonly SignInManager<IdentityUser> _signInManager;
        public RegistrationModel Signup { get; set; }
        public UserModel User { get; set; } = new();

        public SignupModel(SignInManager<IdentityUser> signInManager, AppDbContext context)
        {
            _signInManager = signInManager;
            _context = context; 
        }

      
        public void OnGet()
        {
        }

        public async Task<IActionResult>  OnPostAsync()
        {
            await _signInManager.SignOutAsync();

            ModelState.Remove("User");
            if (ModelState.IsValid)
            {
                // Registration
                IdentityUser newuser = new IdentityUser();
                UserModel user = new UserModel();
                newuser.UserName = Signup.Username;
                newuser.Email = Signup.Email;

                //Binding username to his "nickname" on forum
                user.Username = Signup.Username;
                user.Interests = new List<InterestModel> {  };
                
                _context.Users.Add(User);

                IdentityResult registration = await _signInManager.UserManager.CreateAsync(newuser, Signup.Password);

                if (registration.Succeeded)
                {
                    // Logga in användare
                    var signInResult = await _signInManager.PasswordSignInAsync(Signup.Username, Signup.Password, false, false);

                    if (signInResult.Succeeded)
                    {
                        return RedirectToPage("/Index");
                    }
                }

              
            }

            return Page();
        }
    }
}


Edit:
Wypełniłem każdego propety żeby niebyło null, ale i tak ModelState.IsValid jest false

   public async Task<IActionResult>  OnPostAsync()
        {
          //  await _signInManager.SignOutAsync();
            User.Username = Signup.Username;
            User.Interests = new List<InterestModel> { };
            User.Messages = new List<MessageModel> { };
            User.Threads = new List<ThreadModel> { };
            User.UserInterests = new List<UserInterestModel> { };

            if (ModelState.IsValid)
            {
0

Jak dobrze pamiętam, to w ModelState są szczegóły i powinien być powód dlaczego jest IsValid = false

0

Jest isValid false ponieważ User.Username jak i cała reszta członków tej klasy jest Null, mimo że binduje im wartości i niepowinny być null.

1

@Lobos91: niepowinny być null

to nie są czy nie powinny? :P

0

Dobra problem rozwiązany. Nie zrobiłem migracji do bazy danych i mialem not-nullable propertisy w modelu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1