Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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

Aktivity
Avatar
Tadeáš Burda
Brigádník
Avatar
Tadeáš Burda :1.8.2019 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.8.2019 17:30
Avatar
Martin Petrovaj
Tvůrce
Avatar
Odpovídá na Tadeáš Burda
Martin Petrovaj:1.8.2019 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.8.2019 19:39
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Martin Petrovaj
Tadeáš Burda :2.8.2019 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.8.2019 13:11
Avatar
Tadeáš Burda
Brigádník
Avatar
Tadeáš Burda :2.8.2019 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.8.2019 13:27
Avatar
Martin Petrovaj
Tvůrce
Avatar
Martin Petrovaj:2.8.2019 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.8.2019 13:52
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Martin Petrovaj
Tadeáš Burda :2.8.2019 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.8.2019 15:35
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.