Skip to content

Commit b6e9a2e

Browse files
chore(listView): example how to use custom validation
1 parent 4f2f1d7 commit b6e9a2e

File tree

1 file changed

+149
-0
lines changed

1 file changed

+149
-0
lines changed

components/listview/editing.md

+149
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,155 @@ Implementing beautiful rendering is up to the application, this example shows th
140140
141141
![editing in the listview](images/listview-editing-sample.png)
142142

143+
>tip You can add validation in the edit/insert templates as well, and handle it by cancelling the `OnUpdate` and `OnCreate` events depending on the result of the validation (be that local `DataAnnotation` validation, or remote validation through your data service).
144+
145+
>caption Validation in ListView editing
146+
147+
````CSHTML
148+
@using System.ComponentModel.DataAnnotations
149+
150+
<TelerikListView Data="@ListViewData" Pageable="true"
151+
OnCreate="@CreateHandler" OnDelete="@DeleteHandler" OnUpdate="@UpdateHandler" OnCancel="@CancelHandler">
152+
<EditTemplate>
153+
<div style="border: 1px solid green; margin: 10px; padding: 10px; display: inline-block;">
154+
@{
155+
currEditItem = context;
156+
if(currEditContext == null)
157+
{
158+
currEditContext = new EditContext(currEditItem);
159+
}
160+
<EditForm EditContext="@currEditContext" Context="formContext">
161+
<DataAnnotationsValidator />
162+
<TelerikTextBox @bind-Value="@currEditItem.Name" Label="Name" />
163+
<ValidationMessage For="@(() => currEditItem.Name)"></ValidationMessage>
164+
165+
<br />
166+
<TelerikDropDownList Data="@Teams" @bind-Value="@currEditItem.Team" />
167+
168+
<ListViewCommandButton Command="Save" Icon="@IconName.Save">Save</ListViewCommandButton>
169+
<ListViewCommandButton Command="Cancel" Icon="@IconName.Cancel">Cancel</ListViewCommandButton>
170+
</EditForm>
171+
}
172+
</div>
173+
</EditTemplate>
174+
<Template>
175+
<div style="border: 1px solid black; margin: 10px; padding: 10px; display: inline-block;">
176+
Employee: @context.Id <br />
177+
Name: @context.Name in team: @context.Team
178+
<ListViewCommandButton Command="Edit" Icon="@IconName.Edit">Edit</ListViewCommandButton>
179+
<ListViewCommandButton Command="Delete" Icon="@IconName.Delete">Delete</ListViewCommandButton>
180+
</div>
181+
</Template>
182+
<HeaderTemplate>
183+
<ListViewCommandButton Command="Add" Icon="@IconName.Plus">Add Employee</ListViewCommandButton>
184+
<p>In this sample, the first item will not open for editing because of the code in the OnEdit handler</p>
185+
</HeaderTemplate>
186+
</TelerikListView>
187+
188+
@code{
189+
Employee currEditItem { get; set; }
190+
EditContext currEditContext { get; set; }
191+
192+
async Task CreateHandler(ListViewCommandEventArgs e)
193+
{
194+
Employee insertedItem = e.Item as Employee;
195+
196+
// sample validation
197+
if (!currEditContext.Validate())
198+
{
199+
// prevent the listview from going back in view mode
200+
e.IsCancelled = true;
201+
return;
202+
}
203+
204+
// if you need remote validation (e.g., check for duplicates on the server)
205+
// add it here through your data service and cancel the event as well
206+
207+
// save actual data here through your service
208+
209+
// update the view-model, can use returned data from the remote service too
210+
insertedItem.Id = ListViewData.Count + 1;
211+
ListViewData.Insert(0, insertedItem);
212+
213+
CleanUpValidation();
214+
}
215+
216+
async Task DeleteHandler(ListViewCommandEventArgs e)
217+
{
218+
Employee deletedItem = e.Item as Employee;
219+
220+
ListViewData.Remove(deletedItem);
221+
222+
// save to the actual data source here as well
223+
}
224+
225+
async Task UpdateHandler(ListViewCommandEventArgs e)
226+
{
227+
Employee updatedItem = e.Item as Employee;
228+
229+
// sample validation
230+
if (!currEditContext.Validate())
231+
{
232+
// prevent the listview from going back in view mode
233+
e.IsCancelled = true;
234+
return;
235+
}
236+
237+
// if you need remote validation (e.g., check for duplicates on the server)
238+
// add it here through your data service and cancel the event as well
239+
240+
// save actual data here through your service
241+
242+
// update the view-model, can use returned data from the remote service too
243+
int index = ListViewData.FindIndex(itm => itm.Id == updatedItem.Id);
244+
if (index > -1)
245+
{
246+
ListViewData[index] = updatedItem;
247+
}
248+
249+
CleanUpValidation();
250+
}
251+
252+
void CancelHandler(ListViewCommandEventArgs e)
253+
{
254+
CleanUpValidation();
255+
}
256+
257+
void CleanUpValidation()
258+
{
259+
// clean up for next run
260+
currEditContext = null;
261+
currEditItem = null;
262+
}
263+
264+
// data and models follow
265+
266+
List<Employee> ListViewData { get; set; }
267+
268+
protected override void OnInitialized()
269+
{
270+
ListViewData = Enumerable.Range(1, 250).Select(x => new Employee
271+
{
272+
Id = x,
273+
Name = $"Name {x}",
274+
Team = Teams[x % Teams.Count]
275+
}).ToList();
276+
}
277+
278+
List<string> Teams = new List<string> { "Sales", "Dev", "Support" };
279+
280+
public class Employee
281+
{
282+
public int Id { get; set; }
283+
284+
[Required(ErrorMessage = "Enter a name")]
285+
public string Name { get; set; }
286+
287+
public string Team { get; set; }
288+
}
289+
}
290+
````
291+
143292
## See Also
144293

145294
* [ListView Overview]({%slug listview-overview%})

0 commit comments

Comments
 (0)