Diskuze: ASP.NET Core - nový riadok v tabulke db
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


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>
+20 Zkušeností

Tadeáš Burda :2.8.2019 13:11
Dík za odpoveď. Bohužiaľ to nefunguje InvalidOperationException: 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 "AvailableCategories" 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");}
}
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.
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>
Tadeáš Burda :2.8.2019 15:35
Už mi to ide 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,Name,Description,Category")] Procedure
procedure) to Category. Dakujem fakt moc
Zobrazeno 6 zpráv z 6.