我正在尝试更改材料的信息,我尝试的方式是有一个所有材料的列表,并且在特定方法的 div 中我放置了一个更改材料按钮,可以将您带到不同的位置页面上有一个表单,您可以在其中添加新数据。
该表单将调用编辑方法。问题是,当调用该方法时,它会收到错误,因为 id 为 null。因此,在第二个视图页面和控制器类之间的某个位置,id 丢失了,我不知道如何处理它,我缺少什么。
我尝试获取材料.Id 并将其放入 asp 中,这样表单将专门显示该材料。
这是表单所在的视图类
<form id="editForm" asp-action="Edit" asp-controller="Merde" method="post">
<div asp-validation-summary="All" class="text-danger"></div>
<input type="hidden" asp-for="Id" />
<div class="form-group">
<label asp-for="Title" class="control-label">Titel</label>
<input asp-for="Title" class="form-control" />
<span asp-validation-for="Title" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Description" class="control-label">Beskrivning</label>
<textarea asp-for="Description" class="form-control"></textarea>
<span asp-validation-for="Description" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Color" class="control-label">Färg</label>
<input asp-for="Color" class="form-control" />
<span asp-validation-for="Color" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Pattern" class="control-label">Mönster</label>
<input asp-for="Pattern" class="form-control" />
<span asp-validation-for="Pattern" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="MaterialType" class="control-label">Materialtyp</label>
<select asp-for="MaterialType" class="form-control">
@foreach (var materialType in Enum.GetValues(typeof(MaterialType)))
{
<option value="@materialType">@materialType</option>
}
</select>
<span asp-validation-for="MaterialType" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" id="saveButton" class="btn btn-primary" value="spara">
<a asp-action="AdddMaterials" class="btn btn-secondary">Avbryt</a>
</div>
</form>
方法是这样的:
[HttpPost]
public IActionResult Edit(int id, EditMaterialViewModel model)
{
Console.WriteLine(model.Id);
//if (ModelState.IsValid)
//{
var material = _context.Materials.Find(id);
//if (material == null)
//{
// return NotFound();
//}
material.Id = model.Id;
material.Title = model.Title;
material.Description = model.Description;
material.Color = model.Color;
material.Pattern = model.Pattern;
material.MaterialType = model.MaterialType;
_context.Update(material);
_context.SaveChanges();
TempData["SuccessMessage"] = "Ändring av material lyckades!";
var createMaterial = new CreateMaterial();
/*var materials*/
createMaterial.MaterialsList = _context.Materials.ToList();
createMaterial.Materials = new Materials();
// ViewBag.Materials = materials;
return View("AdddMaterials", createMaterial);
}
这就是我尝试从中获取 id 的地方:
@foreach (var material in @Model.MaterialsList)
{
if (material.Deleted == false) // Check if material is not deleted
{
<div class="card mb-3">
<div class="card-body">
<h5 class="card-title">Material: @material.Title</h5>
<p class="card-text">Beskrivning: @material.Description</p>
<p class="card-text">Färg: @material.Color</p>
<p class="card-text">Mönster: @(material.Pattern ?? "Inget mönster angivet")</p>
<p class="card-text">Material Typ: @material.MaterialType</p>
<!-- Delete Button -->
<input type="hidden" name="id" value="@material.Id" />
<button onclick="openPopup(@material.Id)" class="btn btn-danger">Delete</button>
<button class="btn btn-primary"><a class="linkToTheFuckItEverythingIsGoingWrong" asp-area="" asp-controller="Merde" asp-action="EditMaterialViewModel" asp-route-id="@material.Id">Ändra material(@material.Id)</a></button>
</div>
</div>
}
}
一个朋友帮我解决了这个问题,因为我的第二个视图页面和控制器之间没有关系,所以我需要这个'
public IActionResult EditMaterialViewModel(int id){var createMaterial = new CreateMaterial(); createMaterial.Materials = new Materials(); createMaterial.Materials.Id = id; return View(createMaterial);}
'来建立连接,以便重新获取id