Core.AspNet.Web.DynamicData
1.0.0.26263
dotnet add package Core.AspNet.Web.DynamicData --version 1.0.0.26263
NuGet\Install-Package Core.AspNet.Web.DynamicData -Version 1.0.0.26263
<PackageReference Include="Core.AspNet.Web.DynamicData" Version="1.0.0.26263" />
<PackageVersion Include="Core.AspNet.Web.DynamicData" Version="1.0.0.26263" />
<PackageReference Include="Core.AspNet.Web.DynamicData" />
paket add Core.AspNet.Web.DynamicData --version 1.0.0.26263
#r "nuget: Core.AspNet.Web.DynamicData, 1.0.0.26263"
#:package Core.AspNet.Web.DynamicData@1.0.0.26263
#addin nuget:?package=Core.AspNet.Web.DynamicData&version=1.0.0.26263
#tool nuget:?package=Core.AspNet.Web.DynamicData&version=1.0.0.26263
Core.AspNet.Web.DynamicData
ASP.NET Dynamic Data on .NET 10 — the scaffolding that builds list, detail, edit and insert pages
from a data model, with [ScaffoldTable], [ScaffoldColumn], field templates and metadata attributes
working as they did.
<PackageReference Include="Core.AspNet.Web.DynamicData" Version="1.0.0" />
Assembly vs package name. The package is
Core.AspNet.Web.DynamicData; the assembly inside it isCore.Web.DynamicData. .NET ships an emptySystem.Web.dllfacade and the host gives the shared framework precedence, so the port cannot use the original assembly names. Namespaces are unchanged —System.Web.DynamicData.MetaModelis stillSystem.Web.DynamicData.MetaModel.
Registration
Global.asax is unchanged, except for what the context is:
void Application_Start (object sender, EventArgs e)
{
var model = new MetaModel ();
model.RegisterContext (() => new ShopContext (), new ContextConfiguration { ScaffoldAllTables = true });
RouteTable.Routes.Add (new DynamicDataRoute ("{table}/{action}.aspx") {
Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }),
Model = model,
});
}
The one substitution: the model provider
Dynamic Data reads its model through an abstract DataModelProvider / TableProvider /
ColumnProvider triple. Upstream ships exactly one implementation of it — over LINQ to SQL, which
does not exist on .NET and is not coming. That was the only thing stopping Dynamic Data being ported;
the scaffolding, routing, field templates and metadata are all data-layer agnostic.
So this package replaces the triple with QueryableDataModelProvider, which reads any context
exposing IQueryable or IEnumerable members:
public class ShopContext : DbContext // ...or a repository, or a class of List<T>
{
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
}
It is the default, so RegisterContext needs no argument naming it. Nothing here references EF Core —
the port must not force a database stack on an application that only wants a GridView — so the shape
is found by reflection. That means EF Core, a hand-rolled unit of work, and an in-memory list of
objects all work, and the last of those makes the whole thing testable without a database.
Conventions it applies
| Tables | every public IQueryable/IEnumerable member of the context. string is excluded explicitly — it is IEnumerable<char> |
| Primary key | [Key], else a property named Id, else <Type>Id. No match leaves the table listable but not editable, rather than failing the model |
| Store-generated key | [DatabaseGenerated] if present; otherwise an int, long or Guid key is assumed generated — the EF Core convention |
| Read-only columns | a property with no setter is treated as generated |
| Max length | [StringLength] or [MaxLength] |
What "generated" means for scaffolding
Both rows above end at ColumnProvider.IsGenerated, and MetaColumn.Scaffold turns that into
hidden, not "shown but read-only" — so an identity Id and a computed property appear on neither
the list page nor the edit page. That is upstream Dynamic Data's rule, not this port's; MetaColumn
reads IsGenerated || IsCustomProperty and returns false, exactly as it does on .NET Framework, where
a LINQ to SQL identity column behaves the same way.
If you want a computed column on the list page, give it [UIHint] — a UI hint wins over the generated
check — or add a private setter, which makes it an ordinary column.
The key is still reachable regardless of scaffolding: MetaTable.PrimaryKeyColumns and
GetActionPath (action, row) do not consult Scaffold, which is how Samples/DynamicDataSample
builds DataKeyNames and its Details links for a table whose key is never rendered.
ScaffoldTableAttribute
.NET Core's System.ComponentModel.Annotations kept ScaffoldColumnAttribute and dropped
ScaffoldTableAttribute — scaffolding a whole table was a Dynamic Data concept, and Dynamic Data was
not ported. This package declares it again, in its original System.ComponentModel.DataAnnotations
namespace, so [ScaffoldTable(true)] on an entity keeps compiling and keeps meaning what it meant.
What is not here
- LINQ to SQL support.
DLinqDataModelProviderand its table/column/association providers are excluded. ADataContextcannot be a Dynamic Data context here; use EF Core or any queryable. - The Visual Studio project templates. The scaffolding pages themselves (
List.aspx,Details.aspx, theFieldTemplatesfolder) are content in your application, not in this package — copy them from an existing Dynamic Data project, or fromSamples/DynamicDataSample. Without aDynamicData/FieldTemplates/folder every scaffolded cell renders empty, and nothing says why. - Foreign-key and children templates.
QueryableDataModelProviderreadsIQueryablemembers, not a relational schema, so it produces no association metadata.ForeignKey.ascxandChildren.ascxhave nothing to bind to, andPopulateListControl,ExtractForeignKeyandLoadWithForeignKeysthrow rather than invent a relationship the model does not describe.
Documentation
PORTING-GUIDE.md and LIMITATIONS.md ship in the repository.
Licence
MIT, as the upstream Mono sources this is built from and the code written for this port.
THIRD-PARTY-NOTICES.md ships in the package and says which part is which.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Core.AspNet.Web.Extensions (>= 1.0.0.26263)
- Core.AspNet.Web.Forms (>= 1.0.0.26263)
- System.Configuration.ConfigurationManager (>= 8.0.0)
-
net6.0
- Core.AspNet.Web.Extensions (>= 1.0.0.26263)
- Core.AspNet.Web.Forms (>= 1.0.0.26263)
- System.Configuration.ConfigurationManager (>= 8.0.0)
-
net8.0
- Core.AspNet.Web.Extensions (>= 1.0.0.26263)
- Core.AspNet.Web.Forms (>= 1.0.0.26263)
- System.Configuration.ConfigurationManager (>= 8.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0.26263 | 39 | 9/20/2026 |
| 1.0.0.26262 | 44 | 9/19/2026 |