Соедините два стола для отображения марки автомобиля - PullRequest
0 голосов
/ 14 мая 2019

я пытаюсь объединить две модели Brand of car и Model of car

using System.Collections;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace TriglavOsiguranje.Models
{
    public class ModeliVozila
    {
        [Key]
        public int Id { get; set; }

        [Required]
        [MaxLength(20)]
        public string Ime { get; set; }



        public virtual MarkeVozila MarkeVozila { get; set; }

    }
}



using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;

namespace TriglavOsiguranje.Models
{
    public class MarkeVozila
    {
        [Key]
        public int Id { get; set; }

        [Required]
        [MaxLength(30)]
        public string Ime { get; set; }

        public virtual ICollection<ModeliVozila> ModeliVozila { get; set; }
    }
}

И в моем Create.cshtml я хочу показать выпадающий список, чтобы выбрать, какая модель автомобилей связана с брендом Как в Volvo -> марка автомобиля S60 -> модель автомобиля Пока что я делал в своем контроллере, я пытаюсь передать идентификатор, используя

ViewBag.MarkeVozilaId = new SelectList(_db.MarkeVozila, "Id", "Name", modeliVozila.MarkeVozila);

И отображается в моем Create View, но я получаю, что Object не установлен на экземпляры объекта Пока вот мой контроллер

    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.Rendering;
    using Microsoft.EntityFrameworkCore;
    using TriglavOsiguranje.Data;
    using TriglavOsiguranje.Models;

    namespace TriglavOsiguranje.Areas.Admin.Controllers
    {
        [Area("Admin")]
        public class ModeliVozilaController : Controller
        {
            private readonly ApplicationDbContext _db;

            public ModeliVozilaController(ApplicationDbContext db)
            {
                _db = db;
            }

            public IActionResult Index()
            {
                return View(_db.Modeli.Include(m => m.MarkeVozila).ToList());
            }

    //GET Create Action Metod
    public IActionResult Create()
    {
        ViewBag.MarkeVozilaId = new SelectList(_db.MarkeVozila, "Id", "Name");
        return View();
    }



//POST Create Action Metod
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create(ModeliVozila modeli)
    {
        if (ModelState.IsValid)
        {
            _db.Add(modeli);
            await _db.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        ViewBag.MarkeVozilaId = new SelectList(_db.MarkeVozila, "Id", "Name", modeli.MarkeVozila);
        return View(modeli);
    }


    //GET Edit Action Metod
    public async Task<IActionResult> Edit(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }
        var modeliVozila = await _db.Modeli.FindAsync(id);

        if (modeliVozila == null)
        {
            return NotFound();
        }

        ViewBag.MarkeVozilaId = new SelectList(_db.MarkeVozila, "Id", "Name");
        return View(modeliVozila);
    }



  //POST Edit Action Metod
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Edit(int id, ModeliVozila modeliVozila)
    {
        if (id != modeliVozila.Id)
        {
            return NotFound();
        }

        if (ModelState.IsValid)
        {
            _db.Update(modeliVozila);
            await _db.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        ViewBag.MarkeVozilaId = new SelectList(_db.MarkeVozila, "Id", "Name", modeliVozila.MarkeVozila);
        return View(modeliVozila);
    }

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

1 Ответ

1 голос
/ 14 мая 2019

Я создал небольшой пример проекта, где вы можете увидеть, как это можно сделать. Я не вижу больше ошибки в вашем коде, но, возможно, вы видите разницу:

Модель (Марка):

namespace WebApplication22.Models
{
    public class Marka
    {
        public int Id { get; set; }

        public string Name { get; set; }

    }
}

Модель (модель):

namespace WebApplication22.Models
{
    public class Model
    {
        public int Id { get; set; }

        public int MarkaId { get; set; }

        [ForeignKey(nameof(MarkaId))]
        public virtual Marka Marka { get; set; }
    }
}

Просмотр (Создать):

@model WebApplication22.Models.Model

@{
    ViewBag.Title = "Create";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Create</h2>


@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Model</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.MarkaId, "MarkaId", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownList("MarkaId", null, htmlAttributes: new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.MarkaId, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

Контроллер (POST Create):

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Id,MarkaId")] Model model)
{
    if (ModelState.IsValid)
    {
        db.Models.Add(model);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    ViewBag.MarkaId = new SelectList(db.Markas, "Id", "Name", model.MarkaId);
    return View(model);
}

Надеюсь, это поможет вам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...