Страница Razor: перенаправление с параметрами

#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 вопроса:

  1. Если я нажимаю «Отправить» и получаю ошибку модели, я получаю сообщение об ошибке, но поля, в которых используется @Model.Идентификатор организации не отображается. Я предполагаю, что когда OrganizationId устанавливается в методе OnGet(), это теряется после публикации. Означает ли это, что мне нужно будет повторно заполнить мою CreateModel.Идентификатор организации в методе OnPostAsync()?
  2. Если я добьюсь успеха, строка:

верните страницу перенаправления («/ 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()?

Ответ на это был:

  1. Вместо объявления аргументов в методе OnPostAsync я должен использовать свойства в самой CreateModel (с привязкой).
  2. Используйте [BindProperty] для свойства OrganizationId в CreateModel.
  3. В элементе управления вводом измените имя поля 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; }
 

Используя вышеуказанные:

  1. В сообщении, в котором не выполняется проверка модели, свойства сохраняются в пользовательском интерфейсе после

    страница возврата();

  2. Перенаправление на страницу работает теперь, когда я переместил параметр во второй аргумент как анонимный объект, вместо объединения строки в качестве параметра запроса.