DropDownList - zapis elementu do bazy

0

Rozszerzam sobie template rejestracji i wymysliłem tam sobie listę rozwijaną, problem w tym że nie bardzo wiem jak z tej listy wysłać wybrany element do bazy. Obecnie mam coś takiego:

public ActionResult _RegisterSystem(RegisterModel model, string ResultProvince)
        {
            if (ModelState.IsValid)
            {

                //Attempt to register the user
                try
                {
                    WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { model.City, model.eMail, model.ProvinceElement });
                    WebSecurity.Login(model.UserName, model.Password);
                    ViewBag.result = ResultProvince;
                     

                    return RedirectToAction("_LoginSystem", "LoginSys");
                }
                catch (MembershipCreateUserException e)
                {
                    ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
                }
            }
          
            return View(model);
        }

View z listą wygląda tak:

 @Html.DropDownList("ResultProvince", ViewBag.ResultProvince as SelectList, "Wybierz województwo", new { @class = "form-control" })

Przy submicie dostaje taki błąd:
There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'ResultProvince'.
Tylko nie bardzo rozumiem jak to ViewData wysłać do z powrotem do kontrolera.

0
       
@using (Html.BeginForm("_RegisterSystem", "Nazwa Twojego kontrolera", FormMethod.Post))
{
      @Html.AntiForgeryToken()
      @Html.DropDownList("ResultProvince", ViewBag.ResultProvince as SelectList, "Wybierz województwo", new { @class = "form-control" })
}

spróbuj tak w widoku

0

Cały czas wyrzuca błąd na:

@Html.DropDownList("ResultProvince", ViewBag.ResultProvince as SelectList, "Wybierz województwo", new { @class = "form-control" })

Próbowałem w ten sposób ale też nie chce działać:
http://www.asp.net/mvc/overview/older-versions/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc

0

To w takim razie pokaż metode get i model i sprawdź debugerem czy (ModelState.IsValid) zwraca true.

0
Progress napisał(a):

To w takim razie pokaż metode get i model i sprawdź debugerem czy (ModelState.IsValid) zwraca true.

Controller:

   
 [AllowAnonymous]
 public ActionResult _RegisterSystem()
        {
            using (EFDbContext _context = new EFDbContext())
            {

                var resultProvinces = _context.Provinces.Where(c => c.Name != null).ToList();
                var provincesListItem = resultProvinces.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() });
                @ViewBag.ResultProvince = provincesListItem;
                return View();
            }
        }

Liste deklaruje w tym samym controlerze bo był problem z 2 modelami w widoku:

public class LoginSysController : Controller
    {
        //
        // GET: /LoginSys/
        public List<Province> ProvinceList = new List<Province>();
   ...
   ...
   ...
     }

w modelu mam:

public string ProvinceElement { get; set; }

ale to chyba nie potrzebne

ModelState.IsValid

zwraca false

1

Jak zwraca false tzn, że DropDownList jest ok. Jak IsValid jest false to wtedy odpala ponownie widok w tym miejscu w metodie post:

return View(model);

ale nie przekazujesz wtedy listy poprzez ViewBag (tak jak w metodzie get) przez co wyskakuje Twój błąd.

Pokaż view i model. Prawdopodownie w view nie przypisujesz wartości do któregoś w wymaganych parametrów modelu

1

Account model:

 public class RegisterModel
    {
        [Required]
        [Display(Name = "User name")]
        public string UserName { get; set; }

        [Required]
        [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Confirm password")]
        [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
        public string ConfirmPassword { get; set; }

        [Required]
        [Display(Name = "City")]
        public string City { get; set; }

        [Required]
        public string ProvinceElement { get; set; }

        [Required]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "e-mail")]
        public string eMail { get; set; }

        [Display(Name = "Accepted")]
        public bool acceptedBar { get; set; }
    }

view:

@using (Html.BeginForm( new { ReturnUrl = ViewBag.ReturnUrl }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()

    <div class="container">
        <fieldset class="form-signin">
            <div class="input-group">
                <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
                @Html.TextBoxFor(m => m.UserName, new { @class = "form-control", @placeholder = "Login" })
            </div>

            <div class="input-group">
                <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
                @Html.PasswordFor(m => m.Password, new { @class = "form-control", @placeholder = "Hasło" })
            </div>

            <div class="input-group">
                <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
                @Html.PasswordFor(m => m.ConfirmPassword, new { @class = "form-control", @placeholder = "Powtórz hasło" })
            </div>
            <p></p>

            <div class="input-group">
                <span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i></span>
                @Html.TextBoxFor(m => m.eMail, new { @class = "form-control", @placeholder = "e-mail" })
            </div>
            
            @Html.TextBoxFor(m => m.City, new { @class = "form-control", @placeholder = "Miasto" })

            @Html.DropDownList("ResultProvince", ViewBag.ResultProvince as SelectList, "Wybierz województwo", new { @class = "form-control" })

             
            <p></p>

            <label class="checkbox">
                @Html.CheckBoxFor(m => m.acceptedBar)
                ......
            </label>

            <input type="submit" value="Zarejestruj" class="btn btn-lg btn-primary btn-block" />
            <input type="button" value="Powrót do logowania" class="btn btn-default btn-lg btn-block" onclick="location.href='@Url.Action("_LoginSystem", "LoginSys")'" />
        </fieldset>


    </div>
}

Dane z listy sa przesyłane ale w postaci indeksu:

1
        
[Required]
public string ProvinceElement { get; set; }

Ten element jest wymagany przez model, a nie zwracasz go w widoku, dlatego sie nie validuje. Usuń go z modelu, jeżeli z niego nie korzystasz, albo usuń samo Required

0
Progress napisał(a):
        
[Required]
public string ProvinceElement { get; set; }

Ten element jest wymagany przez model, a nie zwracasz go w widoku, dlatego sie nie validuje. Usuń go z modelu, jeżeli z niego nie korzystasz, albo usuń samo Required

Ok to już działa:) Teraz trzeba przechwycić element z listy który przychodzi jako:
ResultProvince
Tutaj znajduje się ID elementu i jakoś trzeba to przekazać do:

model.ProvinceRegion

controller:

if (ModelState.IsValid)
            {

                //Attempt to register the user
                try
                {
                    WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { model.City, model.eMail, model.ProvinceRegion});
                    WebSecurity.Login(model.UserName, model.Password);
                    
                     

                    return RedirectToAction("_LoginSystem", "LoginSys");
                }
                catch (MembershipCreateUserException e)
                {
                    ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
                }
0

Lista zwraca to co jest value, Ty zapisałeś tam id wiec zwraca id.

var provincesListItem = resultProvinces.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() });
 

Zmień na nazwe, jeżeli chcesz żeby zwróciło nazwe.

var provincesListItem = resultProvinces.Select(x => new SelectListItem { Text = x.Name, Value = x.Name });
 

i jak typy będą sie zgadzac to przypisz normalnie w metodzie post:
model.ProwinceRegion = ResultProvince

0
Progress napisał(a):

Lista zwraca to co jest value, Ty zapisałeś tam id wiec zwraca id.

var provincesListItem = resultProvinces.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() });
 

Zmień na nazwe, jeżeli chcesz żeby zwróciło nazwe.

var provincesListItem = resultProvinces.Select(x => new SelectListItem { Text = x.Name, Value = x.Name });
 

wurzuca błąd:
Cannot convert method group 'Name' to non-delegate type 'string'. Did you intend to invoke the method?

0

a próbowałeś dodać .ToString()?

0
Progress napisał(a):

a próbowałeś dodać .ToString()?

Próbowałem i mam cos takiego:

System.Web.Mvc.Html.NameExtensions.Name(System.Web.Mvc.HtmlHelper, string)' is a 'method', which is not valid in the given context

@Progress Właśnie nie do końca łapie co tu jest nie tak:(

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