0

MVC 4 テンプレートのものとは異なる RegisterModel を作成し、新しいユーザーが登録したいときに、「プレミアム」にするかどうかを選択できるようにしたいと考えています。IsPremium のチェックボックスの値を WebSecurity.CreateUserAndAccount メソッドに渡して機能させる方法がわかりません。

問題: ユーザーが登録しようとすると、IsPremium を空にすることはできないという SQL エラーが発生します。

質問: IsPremium chechbox の値を、ユーザーの作成時にデータベースに挿入される値にするために、何を変更する必要がありますか?

RegisterModel と User がどのように関連しているかについての説明を見つけることができませんでした。これも良いでしょう。

明らかに、IsPremium が必要です。

(簡単にするために、[表示] および検証の注釈をすべて削除しました。

 public class RegisterModel
{
    public string UserName { get; set; }
    public string Correo { get; set; }
    public string  Twitter { get; set; }
    public string LinkedIn { get; set; }
    public string Perfil { get; set; }
    public bool IsPremium { get; set; }
    public string Password { get; set; }
    public string ConfirmPassword { get; set; }
}

そして、私の User クラスは次のとおりです。

public class Usuario
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    [EmailAddress]
    public string Correo { get; set; }
    public string UserName { get; set; }
    public string Twitter { get; set; }
    public string Perfil { get; set; }
    public bool IsPremium { get; set; }
    public string LinkedIn { get; set; }
    public List<Evento> Ponencias { get; set; }
    public List<Evento> Asistencias { get; set; }
    public List<Evento> EventosCreados { get; set; }
}

新しいアカウントを作成するためのビューの重要な部分は次のとおりです。

 <fieldset>
    <legend>Formulario de registro</legend>
    <ol>
        <li>
            @Html.LabelFor(m => m.UserName)
            @Html.TextBoxFor(m => m.UserName)
        </li>
        <li>
            @Html.LabelFor(m=>m.Correo)
            @Html.TextBoxFor(m=>m.Correo)
        </li>
        <li>
            @Html.LabelFor(m=>m.Twitter)
            @Html.TextBoxFor(m=>m.Twitter)
        </li>
        <li>
            @Html.LabelFor(m=>m.LinkedIn)
            @Html.TextBoxFor(m=>m.LinkedIn)
        </li>
          <li>
            @Html.LabelFor(m=>m.Perfil)
            @Html.TextBoxFor(m=>m.Perfil)
        </li>
        <li>
            @Html.LabelFor(m=>m.IsPremium)
            @Html.CheckBoxFor(m=>m.IsPremium)
        </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>
    </ol>
    <input type="submit" value="Registrarse" />
</fieldset>

そして最後に私のコントローラー:

 public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
            try
            {
                WebSecurity.CreateUserAndAccount(model.UserName, model.Password, model.IsPremium); // THIS IS WHERE I GET AN EXCEPTION
                WebSecurity.Login(model.UserName, model.Password);
                return RedirectToAction("Index", "Home");
            }
            catch (MembershipCreateUserException e)
            {
                ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
            }
        }
        return View(model);
    }

どうもありがとう。

4

1 に答える 1

0

これは、AccountControllerのRegisterアクションを変更することで解決されました。

public ActionResult Register(RegisterModel model)
{
    if (ModelState.IsValid)
    {
        try
        {
            WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { IsPremium = model.IsPremium, Twitter= model.Twitter} ); //just add properties to that anonymous object
            WebSecurity.Login(model.UserName, model.Password);
            return RedirectToAction("Index", "Home");
        }
        catch (MembershipCreateUserException e)
        {
            ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
        }
    }
    return View(model);
}

次に、追加のプロパティを取得するには、次のようにします。

using (var context = new UsersContext())
                {
                    UserProfile profile = context.UserProfiles.First(x => x.UserName == User.Identity.Name);
                    // TODO: do something with the user profile
                }
于 2013-02-17T16:45:48.400 に答える