WebGrid API changes - Migration Guide
Overview
ALVAO version 26.3 introduced breaking changes to the WebGrid base class to support async/await patterns and improve code organization. All classes that inherit from WebGrid need to be updated.
Summary of Changes
-
InitialSelect()→InitialSelectAsync()- Changed from synchronous to asynchronous
- Now returns
Task<SelectCallbackResponse>instead ofSelectCallbackResponse - No longer needs to be overridden in derived classes
-
New virtual method:
OnInitialSelect(SelectCallbackResponse response)- Optional override for setting up initial parameters
- Called automatically by
InitialSelectAsync()before executing the response
-
GetSelCallRes()→GetSelectCallbackResponse()- Method renamed for clarity
- Signature remains the same:
SelectCallbackResponse GetSelectCallbackResponse(CallbackModel model)
Required Changes in Derived Classes
✅ Change 1: Rename GetSelCallRes to GetSelectCallbackResponse
Before:
public override SelectCallbackResponse GetSelCallRes(CallbackModel model)
{
return new MySelectResponse(model, this);
}
After:
public override SelectCallbackResponse GetSelectCallbackResponse(CallbackModel model)
{
return model != null
? new MySelectResponse(model, this)
: new MySelectResponse(this);
}
✅ Change 2: Remove InitialSelect() override and use OnInitialSelect() instead
Before:
public override SelectCallbackResponse InitialSelect()
{
SelectCallbackResponse resp = new MySelectResponse(this);
resp.Execute();
resp.AdditionalParameters["MyParam"] = MyValue.ToString();
return resp;
}
After:
public override void OnInitialSelect(SelectCallbackResponse response)
{
// Set up any initial parameters on the response if needed
response.AdditionalParameters["MyParam"] = MyValue.ToString();
}
Poznámka
If you didn't override InitialSelect() in your grid, you don't need to add OnInitialSelect() either. The base implementation handles everything.
✅ Change 3: Update HandleCallbackAsync method
Before:
public override async Task<CallbackResponse> HandleCallbackAsync(CallbackModel model)
{
CallbackResponse resp = null;
switch (model.callback)
{
case "select":
resp = GetSelCallRes(model);
await resp.ExecuteAsync();
break;
}
return resp;
}
After:
public override async Task<CallbackResponse> HandleCallbackAsync(CallbackModel model)
{
CallbackResponse resp = null;
switch (model.callback)
{
case "select":
resp = GetSelectCallbackResponse(model);
await resp.ExecuteAsync();
break;
}
return resp;
}
Poznámka
If you didn't override HandleCallbackAsync() in your grid, you don't need to change anything.
Complete Example
Old Implementation:
public class MyCustomGrid : WebGrid
{
public int EntityId { get; set; }
public override SelectCallbackResponse InitialSelect()
{
SelectCallbackResponse resp = new MySelectResponse(this);
resp.Execute();
resp.AdditionalParameters["EntityId"] = EntityId.ToString();
return resp;
}
public override SelectCallbackResponse GetSelCallRes(CallbackModel model)
{
return new MySelectResponse(model, this);
}
}
New Implementation:
public class MyCustomGrid : WebGrid
{
public int EntityId { get; set; }
public override void OnInitialSelect(SelectCallbackResponse response)
{
response.AdditionalParameters["EntityId"] = EntityId.ToString();
}
public override SelectCallbackResponse GetSelectCallbackResponse(CallbackModel model)
{
return model != null
? new MySelectResponse(model, this)
: new MySelectResponse(this);
}
}
Key Points
InitialSelectAsync()is now in the base class - don't override it unless you have a very specific reason- Use
OnInitialSelect()for setup - set additional parameters or perform initialization before the query executes - The base class handles async execution - you no longer need to call
Execute()orExecuteAsync()inInitialSelect()