【问题标题】:ASP.NET Razor Passing full object in formASP.NET Razor 在表单中传递完整对象
【发布时间】:2018-10-03 09:25:39
【问题描述】:

我有一个非常基本的问题,但我似乎找不到解决方案。

我有一个在我的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 中的许可成员只有字段中的值,用户编辑的地方,所有其他字段都为空(不应为空)

这是我的表格(简体):

<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>

【问题讨论】:

    标签: c# razor asp.net-core razor-pages


    【解决方案1】:

    您不能以您尝试过的方式在 HTML 表单中发布 .NET 对象。您只能发布它们的成员值,并让 ModelBinding 在服务器上为您构造对象。

    通常,您会使用隐藏字段来存储所选对象的键值,然后使用该值来确定数据库中需要更新的数据行。

    或者您可以将SelectedLicense 序列化为 JSON,然后使用 Base64 或类似方法对其进行编码,并将其存储在隐藏字段中。然后您可以在服务器上对其进行解码和反序列化。但是,精明的用户可以访问浏览器中的值并自行解码。

    【讨论】:

    • 谢谢,这解释了很多。我很好奇最好的做法是什么。我是否应该传递对象的 ID,然后在我的 OnPost 中再次加载我的对象列表并根据 ID 找到它?
    • 您可以再次加载它,也可以根据提交的值制作更新。如果您使用的是 Entity Framework Core,您将使用主键值创建一个存根对象,附加该对象并将提交的属性值设置为已修改:learnentityframeworkcore.com/dbcontext/modifying-data
    猜你喜欢
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2012-06-23
    • 2021-12-13
    • 2020-03-26
    相关资源
    最近更新 更多