ASP.NET Razor 在表单中传递完整的对象
ASP.NET Razor Passing full object in form
我遇到了一个非常基本的问题,但似乎找不到解决方案。
我有一个在我的 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中的license成员只有在用户编辑的字段中有值,其他字段都是空的(不应该是空的)
这是我的表格(简体):
<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>
您不能以您尝试过的方式 post HTML 表单中的 .NET 对象。你只能post他们的成员值,让ModelBinding在服务器上为你构造对象。
通常,您会使用隐藏字段来存储所选对象的键值,然后使用该值来确定数据库中哪一行数据需要更新。
或者您可以将 SelectedLicense
序列化为 JSON,然后使用 Base64 或类似方法对其进行编码,并将其存储在隐藏字段中。然后你可以在服务器上对其进行解码和反序列化。但是,精明的用户将可以访问浏览器中的值并可以自行对其进行解码。
我遇到了一个非常基本的问题,但似乎找不到解决方案。
我有一个在我的 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中的license成员只有在用户编辑的字段中有值,其他字段都是空的(不应该是空的)
这是我的表格(简体):
<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>
您不能以您尝试过的方式 post HTML 表单中的 .NET 对象。你只能post他们的成员值,让ModelBinding在服务器上为你构造对象。
通常,您会使用隐藏字段来存储所选对象的键值,然后使用该值来确定数据库中哪一行数据需要更新。
或者您可以将 SelectedLicense
序列化为 JSON,然后使用 Base64 或类似方法对其进行编码,并将其存储在隐藏字段中。然后你可以在服务器上对其进行解码和反序列化。但是,精明的用户将可以访问浏览器中的值并可以自行对其进行解码。