Diskuze: ASP.NET Core - nový riadok v tabulke db
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.