我有一个对象class Tag {string Key; string Text;}
和一个绑定到存储表的对象Record
。
class Record { [...Id & other properties...]
public string Name { get; set; } // "FirstRecord"
public string Tags { get; set; } // "3,4,9"
}
更新Name
不会出现问题。但是我对Tags
有一些困难...如您所见,Tags
属性是 int 键的 CSV(例如{1:".net",2:"java",3:"perl" ...}
(。
在Record
的编辑视图中,我构建了一个包含所有可用标签的字典:
Dictionary<string, string> tags = ViewData["tags"] as Dictionary<string, string>;
[...]
<div class="form-group">
<label class="col-md-2 control-label">Tags</label>
<div class="col-md-10">
@foreach (var tag in tags)
{
<div class="checkbox-inline">
<label for="tag_@tag.Key">
<input type="checkbox" id="tag_@tag.Key" value="@tag.Key" />
@tag.Value
</label>
</div>
}
</div>
</div>
最后我有编辑帖子控制器,像这样
// POST: Records/Edit/5
[HttpPost, ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(string id, [Bind("Id,Name")] Record record)
{
if (id != record.Id) {
return NotFound();
}
if (ModelState.IsValid) {
try {
await repository.UpdateTableEntityAsync(record);
}
catch (Exception) { [...] }
return RedirectToAction("Index");
}
return View(record);
}
所以,我很困惑我是否应该像[Bind("Id,Name,Tags")]
一样绑定Tags
,因为该值应该从所有选中的复选框值中获取,然后连接为 CSV 以准备在存储中更新......
如果要将复选框值绑定到字符串,则可以获取复选框的所有值并手动设置模型的值。下面的代码供您参考。
在视图中,添加 的名称属性 复选框。
<input type="checkbox" name="tag_@tag.Key" id="tag_@tag.Key" value="@tag.Key" />
在操作中,我们可以使用 Request.Form 获取复选框的所有值。
[HttpPost, ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(string id, [Bind("Id,Name")] Record record)
{
if (id != record.Id)
{
return NotFound();
}
record.Tags = "";
foreach (var key in Request.Form.AllKeys)
{
if (key.StartsWith("tag_"))
{
record.Tags += Request.Form[key] + ",";
}
}
if (record.Tags.Length > 0)
{
record.Tags = record.Tags.Remove(record.Tags.Length - 1, 1);
}
if (ModelState.IsValid)
{
try
{
await repository.UpdateTableEntityAsync(record);
}
catch (Exception)
{
}
return RedirectToAction("Index");
}
return View(record);
}