我一直在尝试实现一个用户可以添加/删除当前实体的子实体的系统,但是我在使用Ajax.BeginForm
辅助方法时遇到了麻烦(这是我第一次真正使用它)。基本上当我单击提交按钮时,它不会在我的控制器中调用指定的操作。
我已经搜索了几个小时而没有成功,人们之前遇到的大多数问题都是由于某些库没有被引用,但我很确定这不是这里的问题。
无论如何,这是我的代码的重要部分:
局部视图
@using MyProject.Domain.Entities;
@model MyProject.WebUI.ViewModels.UserCustomerViewModel
<div id = "meh222">
@using (
Ajax.BeginForm("AddCustomer", "User",
new AjaxOptions() { UpdateTargetId = "meh222", HttpMethod = "Post" })
)
{
<label>Customers</label>
@*@Ajax.ActionLink("Add Customer", "AddCustomer", "User", new { userID = Model.UserID, customerID = 1001 },
new AjaxOptions() { UpdateTargetId = "meh222", HttpMethod = "POST" }, new { @class = "standardbutton" })*@
<fieldset>
<legend>CustomersLegend</legend>
@Html.HiddenFor(m => m.UserID)
@Html.DropDownListFor(m => m.Customers, new SelectList(Model.AllCustomers, "CustomerID", "Name"))
<p>
<input type="submit" value="Add Customer" />
</p>
</fieldset>
}
<table class="tbl2" id="tbl2">
<thead>
<tr>
<th>CustomerID</th> <th>Name</th> <th>Actions</th>
</tr>
</thead>
<tbody>
@if (Model != null)
{
foreach (Customer item in Model.Customers)
{
<tr>
<td>
@Html.DisplayTextFor(i => item.CustomerID)
</td>
<td>
@Html.DisplayTextFor(i => item.Name)
</td>
<td>
@Ajax.ActionLink("Delete", "DeleteCustomer", "User", new { userID = Model.UserID, customerID = item.CustomerID },
new AjaxOptions() { UpdateTargetId = "meh222" }, new { @class = "standardbutton" })
</td>
</tr>
}
}
</tbody>
</table>
</div>
主视图
<div>
@{ Html.RenderPartial("CustomerPartial", Model.CustomerVM); }
</div>
控制器
[AcceptVerbs(HttpVerbs.Post)]
public PartialViewResult AddCustomer(UserCustomerViewModel vm)
{
return PartialView("CustomerPartial");
}
查看模型
public class UserCustomerViewModel
{
public int UserID;
public IEnumerable<Customer> Customers { get; set; }
public IEnumerable<Customer> AllCustomers { get; set; }
}
我的 _Layout 中的脚本
<script src="@Url.Content("~/Scripts/jquery-1.5.1.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery-ui-1.8.11.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery-ui-1.8.11.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")" type="text/javascript"></script>
只是几个注意事项:
- 如果您查看我的部分视图,您可以看到
Ajax.ActionLink
注释掉了。这是我之前使用的(并且有效),但是我需要对 CustomerID 进行硬编码,因此Ajax.BeginForm
我可以访问从 ViewModel 的 AllCustomers 属性填充的 DropDownList 的值。 - 真正的控制器动作显然有更多的处理,但这不是问题,就好像我在动作中设置了一个断点,它甚至没有被命中。
- 我已经添加了脚本列表,这样人们就可以确切地知道我所引用的内容,以防出现问题。
有谁知道为什么我的提交没有访问AddCustomer
我的控制器中的操作?
如果我没有正确描述问题或者您需要更多信息,请告诉我,我会尽力提供更多信息。
非常感谢。
- - 更新 - -
我从 Chrome 控制台获得的错误数据
这是在控制台中的“500 内部服务器错误”下。
d.support.ajax.d.ajaxTransport.send jquery-1.5.1.min.js:19
d.extend.ajax jquery-1.5.1.min.js:19
e jquery.unobtrusive-ajax.min.js:5
(anonymous function) jquery.unobtrusive-ajax.min.js:5
E jquery-1.5.1.min.js:19
d.event.handle jquery-1.5.1.min.js:19
d.event.add.k.handle.m jquery-1.5.1.min.js:19