#razor #razor-pages
#razor #страницы razor
Вопрос:
У меня есть страница razor, на которой отображается компания и список сотрудников:
@page "/admin/companies/editor/{id}"
@model EditorModel
@{
}
<h1>admin . companies . editor</h1>
<h4>Id = @Model.Id</h4>
<h4>Name = @Model.OrgStructure.Organisation.Name</h4>
<h4>Staff Count = @Model.OrgStructure.Staff.Count</h4>
<table>
<tr>
<th>Id</th>
<th>Name</th>
</tr>
@if (Model.OrgStructure.Staff.Any())
{
foreach (Staff s in Model.OrgStructure.Staff)
{
<tr>
<td>@s.Id</td>
<td>@s.Username</td>
</tr>
}
}
else
{
<tr>
<td colspan="2">No Staff</td>
</tr>
}
</table>
<a class="btn btn-primary" asp-page="/admin/companies/staff/create" asp-route-orgId="@Model.OrgStructure.Organisation.Id">Create Staff</a>
@functions {
public class EditorModel : PageModel
{
public string Id { get; set; }
public OrganisationStructure OrgStructure { get; set; }
public void OnGet(string id)
{
Id = id;
using (DirectoryApp app = ServicesFactory.MakeDirectoryService())
{
OrgStructure = app.GetOrganisationStructureAsync(new Guid(id)).Result;
}
}
}
}
Когда я нажимаю:
<a class="btn btn-primary" asp-page="/admin/companies/staff/create" asp-route-orgId="@Model.OrgStructure.Organisation.Id">Create Staff</a>
Это приводит меня на страницу создания моего персонала:
@page "/admin/companies/staff/create/{orgId}"
@model CreateModel
@{
}
<h1>admin . companies . staff . create</h1>
<h3>OrganisationId = @Model.OrganisationId</h3>
<form method="post">
<input name="OrgId" value="@Model.OrganisationId" />
<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group">
<label>User Name</label>
<input name="UserName" class="form-control" value="@Model.UserName" />
</div>
<button type="submit" class="btn btn-primary">Submit</button>
<a class="btn btn-secondary" asp-page="/admin/companies/editor" asp-route-id="@Model.OrganisationId">Back</a>
</form>
@functions {
public class CreateModel : PageModel
{
[BindProperty]
[Required]
public string UserName { get; set; }
public Guid OrganisationId { get; set; }
public void OnGet(string orgId)
{
OrganisationId = new Guid(orgId);
}
public async Task<IActionResult> OnPostAsync(string userName, string orgId)
{
if (ModelState.IsValid)
{
using (DirectoryApp app = ServicesFactory.MakeDirectoryService())
{
await app.AddStaffToOrganisationAsync(
new Guid(orgId),
new Staff()
{
Username = userName
});
return RedirectToPage("/admin/companies/editor/" orgId.ToString());
}
}
return Page();
}
}
}
У меня есть 2 вопроса:
- Если я нажимаю «Отправить» и получаю ошибку модели, я получаю сообщение об ошибке, но поля, в которых используется @Model.Идентификатор организации не отображается. Я предполагаю, что когда OrganizationId устанавливается в методе OnGet(), это теряется после публикации. Означает ли это, что мне нужно будет повторно заполнить мою CreateModel.Идентификатор организации в методе OnPostAsync()?
- Если я добьюсь успеха, строка:
верните страницу перенаправления («/ admin/companies / editor/» OrgID.toString());
должен вернуть меня к исходному экрану просмотра компании с недавно добавленным сотрудником. Однако я получаю сообщение об ошибке:
При обработке запроса произошло необработанное исключение. Исключение InvalidOperationException: ни одна страница с именем ‘/admin/companies /editor/473be1aa-7d62-4964-b744-b34e0489d7ad’ не соответствует указанным значениям.
Но, если я скопирую и вставлю «/ admin / companies / editor / 473b …» в адресную строку браузера после «localhost: 12345», страница откроется без проблем.
Что я делаю не так?
Обновить
Мне нужно заменить:
return RedirectToPage("/admin/companies/editor/" orgId.ToString());
с
return RedirectToPage("/admin/companies/editor", new { id = orgId.ToString() });
Ответ №1:
Если я нажимаю «Отправить» и получаю ошибку модели, я получаю сообщение об ошибке, но поля, в которых используется @Model.Идентификатор организации не отображается. Я предполагаю, что когда OrganizationId устанавливается в методе OnGet(), это теряется после публикации. Означает ли это, что мне нужно будет повторно заполнить мою CreateModel.Идентификатор организации в методе OnPostAsync()?
Ответ на это был:
- Вместо объявления аргументов в методе OnPostAsync я должен использовать свойства в самой CreateModel (с привязкой).
- Используйте [BindProperty] для свойства OrganizationId в CreateModel.
- В элементе управления вводом измените имя поля OrgID на OrganizationId.
Итак:
<input name="OrgId" value="@Model.OrganisationId" />
Изменения в:
<input name="OrganisationId" value="@Model.OrganisationId" />
И
public async Task<IActionResult> OnPostAsync(string userName, string orgId)
{
if (ModelState.IsValid)
{
using (DirectoryApp app = ServicesFactory.MakeDirectoryService())
{
await app.AddStaffToOrganisationAsync(
new Guid(orgId),
new Staff()
{
Username = userName
});
return RedirectToPage("/admin/companies/editor/" orgId.ToString());
}
}
return Page();
}
Изменения в:
public async Task<IActionResult> OnPostAsync()
{
if (ModelState.IsValid)
{
using (DirectoryApp app = ServicesFactory.MakeDirectoryService())
{
await app.AddStaffToOrganisationAsync(
OrganisationId,
new Staff()
{
Username = this.UserName
});
return RedirectToPage("/admin/companies/editor", new { id = OrganisationId.ToString() });
}
}
return Page();
}
И
[BindProperty]
[Required]
public string UserName { get; set; }
public Guid OrganisationId { get; set; }
Изменения в
[BindProperty]
[Required]
public string UserName { get; set; }
[BindProperty]
public Guid OrganisationId { get; set; }
Используя вышеуказанные:
- В сообщении, в котором не выполняется проверка модели, свойства сохраняются в пользовательском интерфейсе после
страница возврата();
- Перенаправление на страницу работает теперь, когда я переместил параметр во второй аргумент как анонимный объект, вместо объединения строки в качестве параметра запроса.