我对于使用参数从数据库(SQLServer)删除项目有一些问题。我想在Index()中按“删除”引用,然后将名称参数放在Delete()中,并再次将操作重定向到Index()并显示db的内容。当我按“删除”引用时,除了Index():(
public async Task<IActionResult> Delete(string nm)
{
IQueryable<Phone> users = db.Phones;
if (!String.IsNullOrEmpty(nm))
{
users = users.Where(p => p.Name.Contains(nm));
foreach (var item in users)
{
db.Phones.Remove(item);
}
await db.SaveChangesAsync();
}
return RedirectToAction("Index");
}
@model DataApp2.Models.Phone
@{
ViewBag.Title = "Delete";
}
<form method="get">
<div class="form-inline form-group">
<label class="control-label">Name: </label>
@Html.TextBox("nm", Model.Name, htmlAttributes: new { @class = "form-control" })
<input type="submit" value="Delete" class="btn btn-default" />
</div>
</form>
答案 0 :(得分:1)
您自己构建输入并使用表单有点过大/过于复杂。相反,您可以利用.NET MVC框架将请求发送到您的操作 通过将您发布的表格及其中的所有内容替换为:
@Html.ActionLink("Delete", "Delete", new { nm = Model.Name })
这将生成带有文本“ Delete”(<a>
的第一个参数)的链接(ActionLink
标签),并将Model.Name
发送到名为{{1}的数据字段中}更改为控制器中的nm
操作(Delete
的第二个参数)。
我整理了一个概念证明,证明它可行:
查看:
ActionLink
控制器操作:
@Html.ActionLink("Delete", "Delete", new { nm = "hi" })
在此示例中,控制器已成功设置 public ActionResult Delete(string nm)
{
if (!String.IsNullOrEmpty(nm))
{
ViewBag.Name = nm;
}
return RedirectToAction("Index");
}
。请注意,就您遇到的问题而言,我在这里返回ViewBag.Name
而不是您返回的ActionResult
没什么区别。
我猜测您没有在最初加载页面的操作中填充async Task<IActionResult>
。如果您需要更多信息,请发布用于加载视图的get操作的代码。您可以坚持以下方法来检验该理论:
Model.Name
如果您不想通过调试器单步执行代码,则为