Geek tričko zdarma Geek tričko zdarma
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde

Diskuze: ASP.NET Core - nový riadok v tabulke db

Aktivity (4)
Avatar
Tadeáš Burda:1. srpna 17:30

V db mám dve tabuľky Category a Procedure. Procedure sa viaže na kategóriu a obsahuje stĺpec CategoryId. VS mi vygenerovalo ProceduresCon­troller a View pre Create(). Problém je že mi nevygeneroval input pre výber kategórie.

namespace WebApplication1.Models
{
    public class Procedure
    {
        public int Id { get; set; }
        public Category CategoryId { get; set; }
        public string Name { get; set; }
    }
}

Zkusil jsem: Google - weby ale nerobím, takže nerozumiem veciam čo mi google vypľul. Mam tu hotové len základy HTML, CSS, JS.

Chci docílit: Potreboval bych niaky input napr. ListView do ktorého bych cez ViewBag vložil kolekciu _context.Category a užívateľ by vybral jednu a ta by sa priradila k danej procedúre ktorá sa vytvára/ edituje. Ve WPF(Linq to SQL) bych to naťukal za 5min, ale tady mi to važne nejde a už sem steho pod dvoch dnoch šedivý. :-(

Odpovědět 1. srpna 17:30
Myslieť, znamená hovno vedieť...
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Tadeáš Burda
Martin Petrovaj:1. srpna 19:39

Viewmodel:

public class YourViewModel
{
    public Category SelectedCategory { get; set; }
    public List<SelectListItem> AvailableCategories { get; set; }
    // …
}

Kontroler:

[HttpGet]
public IActionResult Create()
{
    var categories = // natiahni si všetky kategórie, ktoré sú na výber
    var model = new YourViewModel()
    {
        AvailableCategories = categories.Select(category => new SelectListItem()
        {
            Value = category.Id,
            Text = category.Name    // netuším čo tam chceš mať
        }).ToList();
    };

    return View(model);
}

View:

@model YourViewModel

@* Toto máš samozrejme vo svojom formulári *@
<select asp-for="SelectedCategory" asp-items="Model.AvailableCategories"></select>

Zdroj

Akceptované řešení
+20 Zkušeností
Řešení problému
Nahoru Odpovědět 1. srpna 19:39
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Odpovídá na Martin Petrovaj
Tadeáš Burda:2. srpna 13:11

Dík za odpoveď. Bohužiaľ to nefunguje InvalidOperati­onException: The entity type "SelectListGroup" requires a primary key to be defined. Vyhodí mi to pri migracii, ak kliknem na stránke na create, alebo aj ked sem to spravil nanovo a dal vygenerovať controller pre "Procedure". Do tej kolekcie "AvailableCate­gories" sem ale musel pridat k "Value = category.Id" ešte .ToString() lebo inak mi to VS ani neskompiluje. Keby to je namne tak to poprepajam ručne, ale zadaní je aby sa kategorie, procedure, atd pridavaly na stránke, tak ak nato idem špatne mohel by si mna navest naspravnu cestu? Mozno sa to snazim spravit uplne blbo.

Takto vyzeraju tabulky:

CREATE TABLE [dbo].[Category] (
    [Id]          INT            IDENTITY (1, 1) NOT NULL,
    [Name]        NVARCHAR (MAX) NOT NULL,
    [Description] NVARCHAR (MAX) NULL,
    CONSTRAINT [PK_Category] PRIMARY KEY CLUSTERED ([Id] ASC)
);
CREATE TABLE [dbo].[Procedure] (
    [Id]          INT            IDENTITY (1, 1) NOT NULL,
    [Name]        NVARCHAR (MAX) NOT NULL,
    [Description] NVARCHAR (MAX) NULL,
    [CategoryId]  INT            NULL,
    CONSTRAINT [PK_Procedure] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_Procedure_Category_CategoryId] FOREIGN KEY ([CategoryId]) REFERENCES [dbo].[Category] ([Id])
);


GO
CREATE NONCLUSTERED INDEX [IX_Procedure_CategoryId]
    ON [dbo].[Procedure]([CategoryId] ASC);

Takto modele:

public class Category
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
    }
public class Procedure
    {
        public Category SelectedCategory { get; set; }
        public List<SelectListItem> AvailableCategories { get; set; }

        public int Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public Category Category { get; set; }
    }

Takto controller:

// GET: Procedures/Create
        [HttpGet]
        public IActionResult Create()
        {
            Category[] categories = _context.Category.ToArray();
            Procedure model = new Procedure()
            {
                AvailableCategories = categories.Select(category => new SelectListItem()
                {
                    Value = category.Id.ToString(), Text = category.Name
                }).ToList()
            };
            return View(model);
        }

A View:

@model WebApplication.Models.Procedure

@{
    ViewData["Title"] = "Create";
}

<h1>Create</h1>

<h4>Procedure</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Name" class="control-label"></label>
                <input asp-for="Name" class="form-control" />
                <span asp-validation-for="Name" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Description" class="control-label"></label>
                <input asp-for="Description" class="form-control" />
                <span asp-validation-for="Description" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Category" class="control-label"></label>
                <select asp-for="SelectedCategory" asp-items="Model.AvailableCategories"></select>
                <span asp-validation-for="Category" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

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

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
Nahoru Odpovědět 2. srpna 13:11
Myslieť, znamená hovno vedieť...
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Tadeáš Burda:2. srpna 13:27

Asi bych mnel este napsat oco mi vlastne ide :-) Mám stránku na kterej by sa mnel uživatel rezervovat na niaku proceduru ktera spada do niakej kategorie. Puvodne sem napsal program pre desktop cez ktery sa do DB pridavaly kategorie a procedure a nasledne sa prevazaly. Teraz je ale zadani aby sa to vsetko robylo cez web. Pridavat do DB mi ide pohode, viem aj ako to v kode previazat, ale netusim jak bych mne spravit uživatelske rozhrani preto. Snazim sa vytvorit neco jak na obrazku.

Nahoru Odpovědět 2. srpna 13:27
Myslieť, znamená hovno vedieť...
Avatar
Martin Petrovaj
Překladatel
Avatar
Martin Petrovaj:2. srpna 13:52

Pokiaľ si dal available categories do modelu, ktorý slúži na updatovanie záznamov v DB tak ti to spadne na tom, na čom píšeš. Ak to chceš sprevádzkovať s minimálnymi úpravami bez toho, aby si vytváral viewmodely, tak AvailableCategories aspoň označ atribútom NotMapped a daj preč vlastnosť SelectedCategory

public class Procedure
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public Category Category { get; set; }
    [NotMapped]
    public List<SelectListItem> AvailableCategories { get; set; }
}

A vo view zmeň

<select asp-for="SelectedCategory" asp-items="Model.AvailableCategories"></select>

na

<select asp-for="Category" asp-items="Model.AvailableCategories"></select>
Nahoru Odpovědět 2. srpna 13:52
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Odpovídá na Martin Petrovaj
Tadeáš Burda:2. srpna 15:35

Už mi to ide 8-) Ano, dal sem to do teho modelu, lebo sem použil Views knemu vygenerovane. Spravim si zvlašt viewmodel iba pre učel pridávania, toto je spatna cesta ;-) Je vtem bordel...O [NotMapped] sem nevedel. Chyba byla este vtem ze mi to varacalo stale null lebo sem zapomnel pridat do Create([Bind("Id,Na­me,Description,Ca­tegory")] Procedure procedure) to Category. Dakujem fakt moc

Nahoru Odpovědět 2. srpna 15:35
Myslieť, znamená hovno vedieť...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.