【发布时间】:2017-10-09 03:19:06
【问题描述】:
目前情况: 对于这个问题的本质,我有两个数据库表/模型。当创建和添加新模型时,我正在使用 AJAX 表单从每个表中更新以列表形式显示的模型数据。实际上,页面无需重新加载即可显示对列表的任何更改。
我在项目列表上方静态显示每个模型的创建表单。这适用于没有外键依赖的模型。但是,我的一个模型在创建表单中也有一个选择列表,该列表与页面上的另一个模型列表相关联。
问题: 当我为更简单的模型添加记录时,具有外键依赖关系的模型的创建表单的选择列表不会更新以包含更改。我知道它为什么不更新,我认为我需要使用 AJAX 来完全就地重新创建创建表单或只更新选择列表。
有没有办法使用 AJAX 表单不仅更新我要添加项目的模型列表,而且同时更新包含创建表单的 div?
我相信我已经包含了所有相关代码,希望能更清楚地了解我的要求
为更简单的模型创建表单示例:
@using (Ajax.BeginForm("_CreateCategory", new AjaxOptions()
{
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "list-categories"
}))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
<label class="control-label col-md-2">Name: </label>
<div class="col-md-5">
@Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
</div>
<div class="col-md-5">
<input type="submit" value="Add" class="btn btn-success" />
</div>
</div>
</div>
}
具有外键依赖的示例模型
@using (Ajax.BeginForm("_CreateType", new AjaxOptions()
{
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "list-types"
}))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
<label class="control-label col-md-2">Name: </label>
<div class="col-md-offset-1 col-md-6">
@Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label class="control-label col-md-3">Category: </label>
<div class="col-md-6">
@Html.DropDownList("CategoryID", null, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.CategoryID, "", new { @class = "text-danger" })
</div>
<div class="col-md-3">
<input type="submit" value="Add" class="btn btn-success" />
</div>
</div>
</div>
}
带有外键的模型的示例列表部分视图
<div id="list-types">
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Category.Name)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Category.Name)
</td>
<td>
@using (Ajax.BeginForm("DeleteType", new { id = item.ID }, new AjaxOptions()
{
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "list-types"
}))
{
@Html.AntiForgeryToken()
<button type="submit" class="no-default">
<span class="glyphicon glyphicon-remove"></span>
</button>
}
</td>
</tr>
}
</table>
</div>
用于添加更简单模型的控制器操作
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult _CreateCategory([Bind(Include = "ID, Name")] Category category)
{
if (ModelState.IsValid)
{
db.Categories.Add(category);
db.SaveChanges();
}
var categories = db.Categories;
return PartialView("_ListCategories", categories.ToList());
}
显示列表和创建表单的示例索引页面代码
<div class="col-lg-4 block">
<h3>Categories</h3>
@Html.Action("_CreateCategory")
@Html.Action("_ListCategories")
</div>
<div class="col-lg-4 block">
<h3>Types</h3>
@Html.Action("_CreateType")
@Html.Action("_ListTypes")
</div>
【问题讨论】:
-
从性能的角度来看,您会发现这更好,因为您只需使用
$.ajax()方法,当您保存Category时,只需返回一个JsonResult表示成功(或其他),在成功回调中,向 DOM 添加一个新的表格行,并根据表单中的值向您的<select>添加一个新的<option>元素 - 无需将整个表格作为部分发送回再次查看 -
你会建议我保持 ajax 表单的使用,而不是使用标准的提交按钮吗?我知道我可以创建一个表单并将其传递给 $.ajax 调用,但我不想不必要地重写我的视图
-
如果你不想解决问题,那么就让它保持原样:) (除了用
<form>替换@Html.AjaxForm(..)并编写脚本之外,还有什么要重写的跨度> -
我认为你误解了大声笑。迁移到 javascript ajax 没有问题。从我收集到的信息来看,所有的帖子数据都应该以表格的形式提交。将表单本身保留为 Ajax.beginform 是否有任何问题,给它一个 id,或者我最终将它传递给 js ajax 方法,并且默认情况下不使用与 ajax 表单关联的提交操作。还是在这种情况下转换回 html.beginform 格式然后将其传递给 js ajax 调用会更好?
-
您不需要
@Ajax.BeginForm()- 只需一个<form id="...">标签即可使用$.ajax()。是的,您应该有一个提交按钮(但您取消了它的操作),因此您可以使用if('#yourFormId'').valid()测试客户端验证(并且您不需要任何data-属性
标签: c# jquery asp.net ajax asp.net-mvc