Proste forum, garść pytań.

Proste forum, garść pytań.
L9
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad rok
  • Postów:74
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

lion137
Jak wyżej, plus może byś jakoś zawęził problem?
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:5 minut
  • Postów:5143
0

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

e.g

Kopiuj
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

edytowany 2x, ostatnio: WeiXiao
L9
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad rok
  • Postów:74
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.

Kopiuj

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

Kopiuj
   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)
            {
edytowany 3x, ostatnio: cerrato
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:5 minut
  • Postów:5143
0

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

L9
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad rok
  • Postów:74
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.

WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:5 minut
  • Postów:5143
1

@Lobos91: niepowinny być null

to nie są czy nie powinny? :P

edytowany 1x, ostatnio: WeiXiao
L9
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad rok
  • Postów:74
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.