Обновить список из Razor View с помощью Entity Framework Core - PullRequest
0 голосов
/ 19 июня 2020

У меня проблема с обновлением из таблицы Razor View, и я не уверен, верен ли мой подход. Вместо того, чтобы отображать данные (для редактирования) в DIV, я показываю их в ТАБЛИЦЕ. Я могу понять, как скрытое свойство используется для обновления строки. В моем случае я показываю несколько строк на странице редактирования, но не могу обновить базу данных только для тех строк, которые имеют обновления.

Моя страница просмотра выглядит так

<form method="post">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>        
    <table class="table">
        <thead>
            <tr>
                <th> @Html.DisplayNameFor(model => model.Fields[0].Name) </th>
                <th> @Html.DisplayNameFor(model => model.Fields[0].Value) </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Fields)
            {
                <tr>
                    <td> <input type="hidden" asp-for=@item.ID /> </td>
                    <td> @Html.DisplayFor(modelItem => item.Name) </td>
                    <td contenteditable='true'> @Html.DisplayFor(modelItem => item.Value) </td>
                </tr>
            }
        </tbody>
    </table>
    <div class="form-group">
        <input type="submit" value="Save" class="btn btn-primary" />
    </div>
</form>

И код позади это. Поля показывают 0 в методе OnPostAsyn c.

[BindProperty]
    public IList<FieldInfo> Fields { get; set; }
    public async Task<IActionResult> OnGetAsync(string id)
    {
        Fields = await _context.FieldInfo.Where(m => m.GUID == id).ToListAsync();
        return Page();
    }

    public async Task<IActionResult> OnPostAsync()
    {
        foreach (var p in Fields) // In this approach Fields shows as count=0
        {
            _context.Attach(p.Value).State = EntityState.Modified;
        }

        _context.Attach(Fields).State = EntityState.Modified; // In this approach Exception: The entity type 'List<FieldInfo>' was not found.

        await _context.SaveChangesAsync();            
        return RedirectToPage("./Index");
    }

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

У меня он заработал после изменения типа, как показано ниже, с IList на List

[BindProperty]
public List<FieldInfo> Fields { get; set; }
0 голосов
/ 19 июня 2020

Если вы хотите работать со списком или коллекцией, вы должны использовать индекс для идентификации отдельных элементов. https://www.learnrazorpages.com/razor-pages/model-binding#binding -complex-collections

В вашем случае я бы использовал явный индекс:

@foreach (var item in Model.Fields)
{
    <tr>
        <td> <input type="hidden" asp-for="Fields[item.ID].ID" />  <input type="hidden" name="Fields.Index" value="Fields[item.ID].ID" /></td>
        <td> @item.Name</td>
        <td><textarea asp-for="Fields[item.ID].Value">@Fields[item.ID].Value">@Fields[item.ID].Value</textarea> </td>
    </tr>
}

Обратите внимание, что значение, присвоенное td, обозначено contenteditable не публикуется как часть формы. Вместо этого следует использовать подходящий элемент управления формы, например input или textarea.

...