Ссылка в частичной странице Razor срабатывает неправильно OnGet - PullRequest
0 голосов
/ 07 февраля 2020

Я использую страницу бритвы для отображения модели ItemT, а внизу я вставил частичное представление, чтобы показать все свойства (которые не назначены этой модели в отношении: m).

PageModel FreePropertiesToItemT имеет два свойства publi c:

public ItemT ItemT { get; set; }  // the one Item to show
public IList<PropertyIndexViewModel> FreeProperties { get; set; } // all free properties

Вызывается метод OnGetAsync(int? id), который отлично работает. На странице все данные отображаются правильно.

В представлении отображается ссылка для каждого свойства:

<a asp-page-handler="addProperty" asp-route-id="@item.PropertyID">add</a>

Это создает ссылку:

<a href="/Inventory/ItemTs/FreePropertiesToItemT?id=1&amp;handler=addProperty">add</a>

Это правильная ссылка (Я думаю). Маршрут, значение идентификатора и обработчик являются правильными, поскольку в PageModel есть второй метод OnGet:

public async Task<IActionResult> OnGetaddPropertyAsync(int? id)

Однако ссылка вызывает только OnGetAsyn c (а не OnGetaddProppertyAsyn c) каждый раз и, конечно же, для каждой недвижимости! Чего мне не хватает?

Модель ItemT:

public class ItemT
{
    [Key]
    public int ItemTID { get; set; }

    [Required]
    [StringLength(100, MinimumLength = 1)]
    [Display(Name = "ItemT")]
    public string Title { get; set; }
    public bool isActive { get; set; } = true;
    public virtual ICollection<ItemTProperty> ItemTProperties { get; set; }
}

ViewModel свободных свойств:

public class PropertyIndexViewModel
{
    [Key]
    public int PropertyID { get; set; }

    [Required]
    [StringLength(100, MinimumLength = 1)]
    public string Title { get; set; }
    public bool DefaultsOnly { get; set; }

    [Display(Name = "Unit")]
    public string Unit { get; set; }

    [Display(Name = "Valuetype")]
    public string Valuetype { get; set; }
}

Страница для перечисления одного ItemT:

@page
@model Inventory.Areas.Inventory.Pages.ItemTs.FreePropertiesToItemTModel

@{
    ViewData["Title"] = "FreePropertiesToItemT";
}

<h1>Free Properties</h1>

<div>
    <h4>ItemT</h4>
    <hr />
    <dl class="row">
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.ItemT.Title)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.ItemT.Title)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.ItemT.isActive)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.ItemT.isActive)
        </dd>
    </dl>
</div>
<div>
    <a asp-page="./Edit" asp-route-id="@Model.ItemT.ItemTID">Edit</a> |
    <a asp-page="./Index">Back to List</a>
</div>
<p></p>

<div>
    @{
        ViewData["FreeProperties"] = true;
    }
    <partial name="../Properties/_Properties.cshtml" model="Model.FreeProperties" />
</div>

Частично загружено:

@using Inventory.DAL.ViewModels
@model IList<PropertyIndexViewModel>

<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model[0].Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model[0].DefaultsOnly)
            </th>
            <th>
                @Html.DisplayNameFor(model => model[0].Unit)
            </th>
            <th>
                @Html.DisplayNameFor(model => model[0].Valuetype)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Title)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.DefaultsOnly)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Unit)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Valuetype)
                </td>
                <td>
                    @if (ViewBag.FreeProperties != null)
                    {
                    <a asp-page-handler="addProperty" asp-route-id="@item.PropertyID">add</a>
                    }
                </td>
            </tr>
        }
    </tbody>
</table>

И код c# за страницей:

namespace Inventory.Areas.Inventory.Pages.ItemTs
{
    public class FreePropertiesToItemTModel : PageModel
    {
        private readonly IUnitOfWork _uow;

        public FreePropertiesToItemTModel(IUnitOfWork uow)
        {
            _uow = uow;
        }

        public ItemT ItemT { get; set; }
        public IList<PropertyIndexViewModel> FreeProperties { get; set; }

        public async Task<IActionResult> OnGetAsync(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            ItemT = await _uow.ItemTRepo.getById((int)id);

            if (ItemT == null)
            {
                return NotFound();
            }            
            FreeProperties = await _uow.PropertyRepo.getFreePropertiesForItemT((int)id);

            return Page();
        }

        public async Task<IActionResult> OnGetaddPropertyAsync(int? id)
        {
            if( id == null)
            {
                return NotFound();
            }
            if(ItemT == null) { return NotFound(); }
            await _uow.ItemTRepo.addProperty(ItemT.ItemTID, (int)id);
            await _uow.Commit();
            return Page();
        }
    }
}

1 Ответ

0 голосов
/ 12 февраля 2020

Проблема в том, что ваша ошибка имени обработчика, измените ее следующим образом:

public async Task<IActionResult> OnGetAddPropertyAsync(int? id)

Первая буква имени обработчика должна быть заглавной, в противном случае handler=addProperty в URL-адресе обрабатывается как строка запроса параметр не имя обработчика.

...