我的概念是使用下拉列表为数据库创建记录,该列表已经包含来自同一数据库但来自其他表的数据。
我的部分数据库如下:
[在Visual Studio中,我使用了自动表支架,我创建了ModelView以跳过使用ID。 ID是自动生成的,因此不需要使用ID来更改ID号。以下是型号:
ModelView使用一个下拉列表,并且将从下拉列表中选择的项与用户输入的基本数据一起传输到数据库。
程序代码尝试:
Controller
public IActionResult Create()
{
ObjectViewModel model = new ObjectViewModel();
foreach (var object in _context.ObjectA)
{
model.ObjectA.Add(new SelectListItem { Text = object.A, Value = object.IdA });
}
foreach (var hear in _context.ObjectB)
{
model.ObjectB.Add(new SelectListItem { Text = object.B, Value = object.IdB });
}
foreach (var object in _context.ObjectC)
{
model.ObjectC.Add(new SelectListItem { Text = object.C, Value = object.IdC });
}
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(string IdA, string IdB, string IdC)
{
ObjectViewModel model = new ObjectViewModel();
ObjectABC abc = new ObjectABC();
if (ModelState.IsValid)
{
foreach (var object in _context.ObjectA)
{
model.ObjectA.Add(new SelectListItem { Text = object.A, Value = object.IdA });
}
if (IdA != string.Empty)
{
var objectsA = (from a in _context.ObjectABC
where a.IdA == IdA
select a).ToList();
if (IdB != string.Empty)
{
var objectsB = (from b in _context.ObjectABC
where b.IdB == IdB
select b).ToList();
foreach (var object in _context.ObjectB)
{
model.ObjectB.Add(new SelectListItem { Text = object.B, Value = object.IdB });
}
if (IdC != string.Empty)
{
var objectsC = (from c in _context.ObjectABC
where c.IdC == IdC
select c).ToList();
foreach (var object in _context.ObjectC)
{
model.ObjectC.Add(new SelectListItem { Text = object.C, Value = object.IdC });
}
}
}
}
_context.Add(abc);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(model);
}
查看
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-gr">
<label asp-for="ObjectA" class="control-label"></label>
<select asp-for="IdA" class="select-style" asp-items="Model.objectsA">
<option value = "" > --Select option--</option>
</select>
</div>
<div class="form-gr">
<label asp-for="ObjectB" class="control-label"></label>
<select asp-for="IdB" class="select-style" asp-items="Model.objectsB">
<option value = "" > --Select option--</option>
</select>
</div>
<div class="form-gr">
<label asp-for="ObjectC" class="control-label"></label>
<select asp-for="IdC" class="select-style" asp-items="Model.objectsC">
<option value = "" > --Select option--</option>
</select>
</div>
<div class="form-gr">
<label asp-for="Price" class="control-label"></label>
<input asp-for="Price" class="form-control" />
<span asp-validation-for="Price" class="text-danger"></span>
</div>
<div class="form-gr">
<input type = "submit" value="Create" class="btn btn-primary" />
</div>
</form>
但是它不起作用。有什么想法吗?
您没有填写ObjectABC
的属性,您可以像这样发布创建操作
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(string IdA, string IdB, string IdC)
{
ObjectABC abc = new ObjectABC();
if (ModelState.IsValid)
{
if (IdA != string.Empty && IdB != string.Empty && IdC != string.Empty)
{
abc.IdA = IdA;
abc.IdB = IdB;
abc.IdC = IdC;
_context.Add(abc);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
}
ObjectViewModel model = new ObjectViewModel();
foreach (var object in _context.ObjectA)
model.ObjectA.Add(new SelectListItem { Text = object.A, Value =object.IdA });
foreach (var hear in _context.ObjectB)
model.ObjectB.Add(new SelectListItem { Text = object.B, Value = object.IdB });
foreach (var object in _context.ObjectC)
model.ObjectC.Add(new SelectListItem { Text = object.C, Value = object.IdC });
model.IdA = IdA;
model.IdB = IdB;
model.IdC = IdC;
return View(model);
}