0

Please bear with my noobness, I'm super new to Asp.NET MVC, I don't really understand it yet.

Basically what I want to do is to update a table in my database from information entered into a form. I have a registration form with several options: FirstName, LastName, Age, Sex, SecretQuestion, SecretQuestionAnswer.

I'd like to insert this data in my UserProfile table (I use SimpleMembershipProvider) to the corresponding columns. Here's my complete Register ActionResult in my main controller:

 [HttpPost]
        [ValidateAntiForgeryToken]
        [RecaptchaControlMvc.CaptchaValidatorAttribute]
        public ActionResult Regisztracio(RegisterModel model, bool captchaValid, string captchaErrorMessage)
        {
            if (ModelState.IsValid)
            {
                if (!captchaValid)
                {
                    ModelState.AddModelError("recaptcha", captchaErrorMessage);
                    return View(model);
                }

                try
                {
                    OneMillionDb db = new OneMillionDb();
                    User user = new User();

                    var token = WebSecurity.CreateUserAndAccount(model.UserName, model.Password, null, true);
                    user.LastName = model.LastName;
                    user.FirstName = model.FirstName;
                    user.Age = model.Age;
                    user.Sex = model.Sex;
                    user.SecretQuestion = model.SecretQuestion;
                    user.SecretQuestionAnswer = model.SecretQuestionAnswer;
                    db.Users.Add(user);
                    db.SaveChanges();



                        return RedirectToAction("Index");


                }
                catch
                {
                    ModelState.AddModelError("UserName", "The username already exists.");
                    ModelState.AddModelError("Email", "The specified E-mail address already exists.");
                    ModelState.AddModelError("ConfirmEmail", "");
                    return View(model);
                }
            }
            return View(model);
        }

OneMillionDb is my dbContext model file:

public class OneMillionDb : DbContext
    {
        public OneMillionDb()
            : base("DefaultConnection")
        {
        }
        public DbSet<User> Users { get; set; }
    }

User is my model class for table definiton. It looks like this:

[Table("UserProfile")]
    public class User
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
        [Column]
        [Required]
        public string UserName { get; set; }
        [Column]
        public string FirstName { get; set; }
        [Column]
        public string LastName { get; set; }
        [Column]
        [Required]
        public int Age { get; set; }
        [Column]
        public string Sex { get; set; }
        [Column]
        [Required]
        public string SecretQuestion { get; set; }
        [Column]
        [Required]
        public string SecretQuestionAnswer { get; set; }
        [Column]
        public int MoneyIn { get; set; }
        [Column]
        public int MoneyOut { get; set; }
        [Column]
        public int TimesWon { get; set; }
    }

I used to work in ASP.NET Web Pages, in that I'd use the UPDATE SQL statement to do this then execute the query..

Edit3: Here's my Register view:

@model OneMillion.Models.RegisterModel
@using Recaptcha;

@{
    ViewBag.Title = "Register";
}

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()
    <fieldset>
        <legend>Register</legend>
        <ul>
            <li>
                @Html.LabelFor(m => m.UserName)
                @Html.EditorFor(m => m.UserName)
            </li>
            <li>
                @Html.LabelFor(m => m.Email)
                @Html.EditorFor(m => m.Email)
            </li>
            <li>
                @Html.LabelFor(m => m.ConfirmEmail)
                @Html.EditorFor(m => m.ConfirmEmail)
            </li>
            <li>
                @Html.LabelFor(m => m.Password)
                @Html.PasswordFor(m => m.Password)
            </li>
            <li>
                @Html.LabelFor(m => m.ConfirmPassword)
                @Html.PasswordFor(m => m.ConfirmPassword)
            </li>
            <li>
                @Html.LabelFor(m => m.LastName)
                @Html.EditorFor(m => m.LastName)
            </li>
            <li>
                @Html.LabelFor(m => m.FirstName)
                @Html.EditorFor(m => m.FirstName)
            </li>
            <li>
                @Html.LabelFor(m => m.Age)
                @Html.EditorFor(m => m.Age)
            </li>
            <li>
                @Html.LabelFor(m => m.Sex)
                @Html.EditorFor(m => m.Sex)
            </li>
            <li>
                @Html.LabelFor(m => m.SecretQuestion)
                @Html.EditorFor(m => m.SecretQuestion)
            </li>
            <li>
                @Html.LabelFor(m => m.SecretQuestionAnswer)
                @Html.EditorFor(m => m.SecretQuestionAnswer)
            </li>
            <li>
                @Html.Raw(Html.GenerateCaptcha())
            </li>
        </ul>
        <input type="submit" value="Register" />
    </fieldset>
}

And here's my RegisterModel:

public class RegisterModel
    {
        [Required]
        [Display(Name = "Felhasználónév")]
        public string UserName { get; set; }

        [Required]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "E-mail cím")]
        public string Email { get; set; }

        [DataType(DataType.EmailAddress)]
        [Display(Name = "E-mail cím megerősítése")]
        [Compare("Email", ErrorMessage = "A két e-mail cím nem egyezik.")]
        public string ConfirmEmail { get; set; }

        [Required]
        [StringLength(100, ErrorMessage = "A jelszónak legalább {2} karakter hosszúnak kell lennie.", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "Jelszó")]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Jelszó megerősítése")]
        [Compare("Password", ErrorMessage = "A jelszó és a jelszó megerősítése mezők nem egyeznek.")]
        public string ConfirmPassword { get; set; }

        [Display(Name= "Vezetéknév")]
        public string LastName { get; set; }

        [Display(Name= "Keresztnév")]
        public string FirstName { get; set; }

        [Display(Name= "Életkor")]
        public int Age { get; set; }

        [Display(Name="Nem")]
        public string Sex { get; set; }

        [Required]
        [Display(Name="Titkos kérdés")]
        public string SecretQuestion { get; set; }

        [Required]
        [Display(Name="Titkos kérdés válasza")]
        public string SecretQuestionAnswer { get; set; }
    }

Edit: My Problem:

The database doesn't get updated. I know this since I get an Exception stating that Column Age can't have a value of NULL, but the corresponding input was filled out.

Edit2: I also changed the code to reflect SOfanatic's answer, but I still get the error.

Edit4: Here's the exception I get in the Catch side of trycatch:

Cannot insert the value NULL into column 'Age', table 'OneMillionDb.dbo.UserProfile'; column does not allow nulls. INSERT fails.
4

3 回答 3

1

在您的User课堂上将以下内容更改为

[Column]
[Required]
public int Age { get; set; }

[Column]
public int? Age { get; set; }

您的声明正在制作该专栏NOT NULL,并且始终是强制性的。

于 2013-06-04T06:44:32.117 回答
1

更新实体类似于添加实体,因此在您的代码中:

try {
   OneMillionDb db = new OneMillionDb();
   User user = new User();

   var token = WebSecurity.CreateUserAndAccount(model.UserName, model.Password, null, true);
   user.LastName = model.LastName;
   user.FirstName = model.FirstName;
   user.Age = model.Age;
   user.Sex = model.Sex;
   user.SecretQuestion = model.SecretQuestion;
   user.SecretQuestionAnswer = model.SecretQuestionAnswer;
   db.Users.Add(user);
   db.SaveChanges();
   return RedirectToAction("Index");
}

更改db.Users.Add(user)db.Entry(user).State = EntityState.Modified

于 2013-06-03T20:19:17.973 回答
1

您已在 User 类中将 UserName 定义为必填字段,但在保存时未为该字段分配任何值。那可能是抛出 EntityValidationError。

于 2013-06-04T14:16:51.017 回答