ASP.NET Razor Передача полного объекта в форму - PullRequest
0 голосов
/ 03 октября 2018

У меня есть очень простая проблема, но кажется, что я не могу найти решение.

У меня есть объект, который инициализирован в моем методе OnGet.Я хочу, чтобы клиент обновил информацию и затем обновил ее обратно в БД.(Некоторая информация об объекте хранится только в БД, но не видна и не редактируется для пользователя)

Теперь я пытаюсь передать полный объект в моей форме в сочетании с входными данными изКлиент.Если я пытаюсь получить доступ к объекту, все атрибуты равны нулю.Вместо этого, если я пытаюсь передать только один атрибут в виде строки в форме, он работает просто отлично.

Это мой код:

public class UpdateLicenseModel : PageModel
{
    private readonly license_backupContext _db;
    public UpdateLicenseModel(license_backupContext db)
    {
        _db = db;
    }
    public IList<License> Licenses { get; set; }

    [BindProperty]
    public License SelectedLicense { get; set; }


    [Auhtorize]
    public void OnGet()
    {
        Licenses = _db.License.ToList();
        SelectedLicense = Licenses.SingleOrDefault(s => s.Licenseid.ToString().Equals(LicenseString));
    }

    public IActionResult OnPost()
    {
        var license = SelectedLicense;
        if (!ModelState.IsValid)
        {
            return Page();
        }
        _db.License.Update(license);
        _db.SaveChanges();

        return RedirectToPage("./Licenses");
    }
}

В приведенном выше коде член лицензии в OnPost имеет значения только в тех полях, где пользователь что-то редактировал, все остальные поля равны нулю (mustnне будет нулевым)

Это моя форма (упрощенно):

<form method="post">
<div class="row">
    <div class="col-6 form-group">
        <label for="ID"><b>ID</b></label>
        <input class="form-control input-sm" id="ID" value="@Model.SelectedLicense.ID" asp-for="SelectedLicense.ID" />
    </div>
    <div class="col-6 form-group">
        <label for="Name"><b>Name</b></label>
        <input class="form-control input-sm" id="Name" value="@Model.SelectedLicense.Name" asp-for="SelectedLicense.Name" />
    </div>
</div>
<div class="row">
    <div class="col">
        <input type="submit" class="btn btn-success" value="Speichern" />
    </div>
</div>
<input type="hidden" asp-for="SelectedLicense" />
</form>

1 Ответ

0 голосов
/ 03 октября 2018

Нельзя публиковать объекты .NET в формах HTML так, как вы пытались.Вы можете только публиковать их значения элементов и позволить ModelBinding создать объект для вас на сервере.

Обычно вы используете скрытое поле для хранения значения ключа выбранного объекта, а затем используете это значение для определениякакая строка данных нуждается в обновлении в базе данных.

Или вы можете сериализовать SelectedLicense в JSON, а затем кодировать его с помощью Base64 или аналогичного и сохранить его в скрытом поле.Затем вы можете декодировать и десериализовать его на сервере.Однако опытные пользователи будут иметь доступ к значению в браузере и могут декодировать его сами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...