Himanshu.A.Joshi Ответов: 1

Я получаю ошибку в ienumerable & lt;selectlist>


вот моя ошибка:-
An exception of type 'System.InvalidOperationException' occurred in System.Web.Mvc.dll but was not handled in user code

Additional information: The ViewData item that has the key 'City' is of type 'System.String[]' but must be of type 'IEnumerable<SelectListItem>'.


я превратил свой город из струны в
IEnumerable
Но все равно не работает

вот моя модель alofcity (отсюда я получаю свой город):-
public class allcity
   {
       [Key]
       public int cid { get; set; }
       [Required]
       public string cities { get; set; }
   }

вот моя Registerviewmodel:-

public string FirstName { get; set; }
[Required]
public string MiddleName { get; set; }
[Required]
public string LastName { get; set; }
[Required]
public string Gender { get; set; }
[Required]
[DataType(DataType.Date)]
public string DOB { get; set; }
[Required]
[RegularExpression("^[0-9]{12}$")]
public decimal Mobile { get; set; }
[Required]
public string Address { get; set; }
[Required]

public IEnumerable<string> City { get; set; }


если я обращу это :-
public IEnumerable<string> City { get; set; }
до настоящего времени:-
public IEnumerable<selectlist> City { get; set; }


тогда он не будет сохраняться в базе данных

вот мой контролер счета

  private ApplicationDbContext db = new ApplicationDbContext();
        // GET: /Account/Register
        [AllowAnonymous]
        public ActionResult Register()
        {
            IEnumerable<SelectListItem> item = db.allofcity.Select(C => new SelectListItem
            {
                Value = C.cities,
                Text = C.cities

            });
            ViewBag.citi = item;
            return View();
        }

        //
        // POST: /Account/Register
        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Register([Bind(Exclude = "UserPhoto")]RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                // To convert the user uploaded Photo as Byte Array before save to DB
                byte[] imageData = null;
                if (Request.Files.Count > 0)
                {
                    HttpPostedFileBase poImgFile = Request.Files["UserPhoto"];

                    using (var binary = new BinaryReader(poImgFile.InputStream))
                    {
                        imageData = binary.ReadBytes(poImgFile.ContentLength);
                    }
                }


                var user = new ApplicationUser() { UserName = model.Email , ConfirmPassword=model.ConfirmPassword,
 FirstName = model.FirstName,
 MiddleName = model.MiddleName,
 LastName = model.LastName,
 Gender = model.Gender,
 DOB = model.DOB,
Mobile = model.Mobile,
 Address = model.Address,
City=model.City};
                //Here we pass the byte array to user context to store in db
                user.UserPhoto = imageData;
               
                user.Email = model.Email;
                user.ConfirmedEmail = false;
                var result = await UserManager.CreateAsync(user, model.Password);
                if (result.Succeeded)
                {
                    System.Net.Mail.MailMessage m = new System.Net.Mail.MailMessage(
                         new System.Net.Mail.MailAddress("myid", "Web Registration"),
                         new System.Net.Mail.MailAddress(user.Email));
                    m.Subject = "Email confirmation";
                    m.Body = string.Format("Dear {0}<BR/>Thank you for your registration, please click on the below link to complete your registration: <a href=\"{1}\" title=\"User Email Confirm\">{1}</a>", user.UserName, Url.Action("ConfirmEmail", "Account", new { Token = user.Id, Email = user.Email }, Request.Url.Scheme));
                    m.IsBodyHtml = true;
                    System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("smtp-mail.outlook.com");
                    smtp.Credentials = new System.Net.NetworkCredential("my id", "mypassword");
                    smtp.Port = 587;
                    smtp.EnableSsl = true;
                    smtp.Send(m);
                    return RedirectToAction("Confirm", "Account", new { Email = user.Email });
                }
                else
                {
                    AddErrors(result);
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }


и вот мой взгляд:-

<div class="form-group">
        @Html.LabelFor(m => m.City, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.DropDownListFor(Model=>Model.City, (IEnumerable<SelectListItem>)ViewBag.citi, "Select City", new { @class = "form-control" })
        </div>
    </div>


Что я уже пробовал:

у меня есть то же самое в другом решении без проверки адреса электронной почты , и оно сохраняет выбранный город из базы данных в мою registerviewmodel

но в этом решении я использую проверку электронной почты и получаю эту ошибку

я перепробовал все, но все равно приходит ошибка

1 Ответов

Рейтинг:
1

Karthik_Mahalingam

Убедитесь, что ViewBag имя ключа одинаково по всей длине controller и cshtml
если вы выбираете только один город, то тип данных города может быть изменен с string[] к string

см. этот пример

public class MyModel
   {
       public string City { get; set; }
       public string OtherProp {get; set;}
   }

   public class HomeController : Controller
   {
       public ActionResult Index()
       {
           List<SelectListItem> lst = new List<SelectListItem>();
           lst.Add(new SelectListItem() { Text = "One", Value= "1" });
           lst.Add(new SelectListItem() { Text = "two", Value = "2" });
           lst.Add(new SelectListItem() { Text = "three", Value = "3" });
           IEnumerable<SelectListItem> item = lst.AsEnumerable();
           ViewBag.ViewBagCity = item;
           MyModel obj = new MyModel();
           return View();
       }

   }



@model MyModel
   @Html.DropDownListFor(Model => Model.City, (IEnumerable<SelectListItem>)ViewBag.ViewBagCity, "Select City", new { @class = "form-control" })