Проблема с DropDownlist в ядре asp.net MVC - PullRequest
0 голосов
/ 16 октября 2019

Я создаю раскрывающийся список (страна, штат и город в таблице в mvc, но не вставлены название страны, название страны, название города и мудрый штат страны, не связывают правильные данные, все штаты и города отображаются в раскрывающемся списке?)

ex: Когда я выбираю Россию, в выпадающем списке отображаются все США и Россия? // см. ссылку

Я применяю первый подход к коду в asp.net core mvc

Manager.cs

    public class Manager
    {
        [Key]
        public int ManagerId { get; set; }
        public string ManagerName { get; set; }

        //Insertion in Manager table country state and city
        [ForeignKey("country")]
        public int countryId { get; set; }
        public string countryname { get; set; }

        [ForeignKey("state")]
        public int stateId { get; set; }
        public string statename { get; set; }

        [ForeignKey("city")]
        public int cityId { get; set; }
        public string cityname { get; set; }

    }

    public class city
    {
        public int cityId { get; set; }
        public string cityname { get; set; }

        [ForeignKey("state")]
        public int stateId { get; set; }
        public virtual state states { get; set; }
    }

    public class state
    {
        public int stateId { get; set; }
        public string statename { get; set; }

        [ForeignKey("country")]
        public int countryId { get; set; }
        public virtual country countrys { get; set; }
    }

    public class country
    {
        public int countryId { get; set; }
        public string countryname { get; set; }
    }

dbcontext.cs

    public class dbcontext : IdentityDbContext<Student>
    {
        public dbcontext(DbContextOptions<dbcontext> options) : base(options)
        {
            Database.EnsureCreated();
        }

        protected override void OnModelCreating(ModelBuilder builder) 
        {
            base.OnModelCreating(builder);
        }

        public virtual DbSet<Manager> manages {get;set;}
        public virtual DbSet<country> countrys { get; set; }
        public virtual DbSet<state> states { get; set; }
        public virtual DbSet<city> citys { get; set; }

    }

HomeController:

    public class HomeController : Controller
    {
        private readonly dbcontext contxtclass;

        public HomeController(dbcontext contxtclass)
        {
            this.contxtclass = contxtclass;
        }

        //not inserted countryname,stataname and cityname in database see the Referance image


        [HttpGet]
       public async Task<IActionResult> Create(int id)
        {
            var manager = await contxtclass.manages
                        .Include(m => m.countryname)
                        .Include(m => m.statename)
                        .Include(m => m.cityname)
                        .FirstOrDefaultAsync(m => m.ManagerId == id);
            var countryname = manager.countryname;
            return View(manager);
        }//here i m put debugger then get an error object referance not set to an object

        [HttpPost]
        public async Task<IActionResult> Create([Bind("ManagerId,ManagerName,countryId,countryname,stateId,statename,cityId,cityname")] Manager manager)
        {
            if(ModelState.IsValid)
            {
                manager.countryname=(await contxtclass.countrys.FindAsync(manager.countryId)).countryname;
                manager.cityname = (await contxtclass.states.FindAsync(manager.stateId)).statename;
                manager.statename = (await contxtclass.citys.FindAsync(manager.cityId)).cityname;
                contxtclass.Add(manager);
                await contxtclass.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }

            //bound the country table record
            List<country> countrylist = new List<country>();
            countrylist = (from countrys in contxtclass.countrys select countrys).ToList();
            countrylist.Insert(0, new country { countryname = "Select" });
            ViewBag.listofcountry = countrylist;

            //bound the state table record
            List<state> statelist = new List<state>();
            statelist = (from states in contxtclass.states select states).ToList();
            statelist.Insert(0, new state { statename = "Select" });
            ViewBag.listofstate = statelist;

            //bound the city table record
            List<city> citylist = new List<city>();
            citylist = (from citys in contxtclass.citys select citys).ToList();
            citylist.Insert(0, new city { cityname = "Select" });
            ViewBag.listofcity = citylist;

            return View(manager);
        }

create.cshtml

@model WebApplication2.Models.Manager

@{
    Layout = null;
}  
<h2>Create</h2>
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly"></div>
            <div>
                <label asp-for="ManagerName"></label>
                <input asp-for="ManagerName"/>
                <span asp-validation-for="ManagerName"></span>
            </div>
            <div>
                <div asp-validation-summary="ModelOnly"></div>
                <div>
                    <label asp-for="countryname"></label>
                    <select asp-for="countryId"
                            asp-items="@(new SelectList(@ViewBag.listofcountry,"countryId","countryname"))"></select>
                </div>
            </div>
            <div>
                <div asp-validation-summary="ModelOnly"></div>
                <div>
                    <label asp-for="statename"></label>
                    <select asp-for="stateId"
                            asp-items="@(new SelectList(@ViewBag.listofstate,"stateId","statename"))"></select>
            </div>
            </div>
            <div>
                <div class="alert-danger" asp-validation-summary="ModelOnly"></div>
                <div>
                    <label asp-for="cityname"></label>
                    <select asp-for="cityId"
                            asp-items="@(new SelectList(@ViewBag.listofcity,"cityId","cityname"))"></select>
                </div>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
</form>

<div>
    <a asp-action="Index">Back to List</a>
</div>

это место кода в методе httpget (create) ??? Я поместил этот код в метод httpget

var manager = await _context.manages
            .Include(m => m.country)
            .Include(m => m.state)
            .Include(m => m.city)
            .FirstOrDefaultAsync(m => m.ManagerId == id);
var countryname = mamager.country.countryname;

дать ссылку на объект ошибки, не установленную для объекта ???

https://imgur.com/a/ENP8D2a

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

С вашим кодом, когда я добавляю точку останова к действию POST, все countryname, cityname, statename равны нулю, поскольку вы не передаете это действию.

Ваш выпадающий список<select asp-for="countryId"> передает только countryId.

Чтобы быстро получить результат, вы можете получить имя по их собственному идентификатору и снова установить ViewBag, чтобы предотвратить ошибку value can not be null, когда состояние модели недопустимо.

Модифицированный код записывается так:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create([Bind("ManagerId,ManagerName,countryId,countryname,stateId,statename,cityId,cityname")] Manager manager)
    {
        if (ModelState.IsValid)
        {
            manager.countryname = (await _context.countrys.FindAsync(manager.countryId)).countryname;
            manager.statename = (await _context.states.FindAsync(manager.stateId)).statename;
            manager.cityname = (await _context.citys.FindAsync(manager.cityId)).cityname;
            _context.Add(manager);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }


        //To prevent your error, you need to set `ViewBag` again

        List<country> countrylist = new List<country>();
        countrylist = (from countrys in contxtclass.countrys select countrys).ToList();
        countrylist.Insert(0,new country {  countryname = "Select" });
        ViewBag.listofcountry = countrylist;

        //bound the state table record
        List<state> statelist = new List<state>();
        statelist = (from states in contxtclass.states select states).ToList();
        statelist.Insert(0, new state { statename = "Select" });
        ViewBag.listofstate = statelist;

        //bound the city table record
        List<city> citylist = new List<city>();
        citylist = (from citys in contxtclass.citys select citys).ToList();
        citylist.Insert(0, new city { cityname = "Select" });
        ViewBag.listofcity = citylist;

        return View(manager);
    }

Другой рекомендуемый способ - просто добавить отношения между вашим менеджером и моделью страны / штата / города, например:

public class Manager
{
    [Key]
    public int ManagerId { get; set; }
    public string ManagerName { get; set; }

    [ForeignKey("country")]
    public int countryId { get; set; }
    public country country { get; set; }

    [ForeignKey("state")]
    public int stateId { get; set; }
    public state state { get; set; }

    [ForeignKey("city")]
    public int cityId { get; set; }
    public city city { get; set; }

}

Тогда вам нужно всего лишь сохранить три внешних ключа в таблице менеджера и получить имя по

var manager = await _context.manages
            .Include(m => m.country)
            .Include(m => m.state)
            .Include(m => m.city)
            .FirstOrDefaultAsync(m => m.ManagerId == id);
var countryname = mamager.country.countryname;

См. https://docs.microsoft.com/en-us/ef/core/querying/related-data#eager-loading

Обновление:

Get метод:

public IActionResult Create()
    {
        //bound the country table record
        List<country> countrylist = new List<country>();
        countrylist = (from countrys in _context.countrys select countrys).ToList();
        countrylist.Insert(0, new country { countryname = "Select" });
        ViewBag.listofcountry = countrylist;

        //bound the state table record
        List<state> statelist = new List<state>();
        statelist = (from states in _context.states select states).ToList();
        statelist.Insert(0, new state { statename = "Select" });
        ViewBag.listofstate = statelist;

        //bound the city table record
        List<city> citylist = new List<city>();
        citylist = (from citys in _context.citys select citys).ToList();
        citylist.Insert(0, new city { cityname = "Select" });
        ViewBag.listofcity = citylist;
        return View();
    }
0 голосов
/ 16 октября 2019

в вашем create.cshtml вашем представлении ожидается модель WebApplication2.Models.Manager

, но в вашем return View(); в вашем Create() вы ничего не передаете.

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

return View(new //WebApplication2.Models.Manager class);

или извлечение чего-либо из вашего контекста (на основании имени это только один менеджер)

return View(context.Managers.First(x => condition)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...