简而言之:是否可以跟踪调用 Ajax.ActionLink 方法的次数?
现在来看看上下文。我有一个简单的模型:
public class Person {
public string Name { get; set; }
public List<Address> Addresses { get; set; }
}
public class Address {
public string City { get; set; }
public string Country { get; set; }
}
所以,一个人可以有很多地址。在“创建”页面上,我希望用户单击一个按钮,该按钮允许他们动态添加任意数量的地址。
我将此页面用作学习如何动态绑定到列表的参考:http: //haacked.com/archive/2008/10/23/model-binding-toa-list.aspx,
以此作为参考,这是我的课程:
家庭控制器:
//
// GET: /Home/
public ActionResult Index() {
return View();
}
[HttpPost]
public ActionResult Create(Person p) {
return View(p);
}
[OutputCache(NoStore = true, Duration = 0)]
public ActionResult AjaxAddAddress() {
TempData["key"] = DateTime.Now.Ticks.GetHashCode();
return PartialView("~/Views/Shared/EditorTemplates/Address.cshtml", new Address());
}
索引视图:
@model ModelTest.Models.Person
<div>
@using (Html.BeginForm("Create", "Home")) {
<div>Name: @Html.TextBoxFor(m => m.Name)</div>
<div id="ajaxAddressBox"></div>
<p>@Ajax.ActionLink("Add Another Address", "AjaxAddAddress", new AjaxOptions {
UpdateTargetId = "ajaxAddressBox",
InsertionMode = InsertionMode.InsertAfter,
HttpMethod = "GET" })</p>
<input id="btnSubmit" type="submit" value="Create" />
}
</div>
创建视图(只是为了确认模型绑定好了):
@model ModelTest.Models.Person
<div>
<p>You entered person: @Model.Name.</p>
<p>He has @Model.Addresses.Count total addresses.
@foreach (var c in Model.Addresses) {
<p>City: @c.City, Country: @c.Country</p>
}
</div>
地址编辑器模板:
@model ModelTest.Models.Address
<p><input type="hidden" name="Addresses.Index" value="@TempData["key"]" />
City: @Html.TextBoxFor(x => x.City, new { Name = "Addresses[" + TempData["key"] + "].City" } )
Country: @Html.TextBoxFor(x => x.Country, new { Name = "Addresses[" + TempData["key"] + "].Country" })</p>
它似乎工作正常,所以我希望到目前为止我做得对。我是 MVC 的新手,所以如果有什么完全错误的,请告诉我。
但我需要它做更多的事情。理想情况下,我想为每一行添加一个标签,上面写着“地址#(索引)”。但更重要的是,我需要限制用户只能添加,例如 5 个地址。无论哪种方式,我都想跟踪调用 Ajax.ActionLink 或方法 AjaxAddAddress 的次数。另外,将来我需要一个也需要该限制的编辑页面。因此,如果现有人员有 3 个地址,他们只能再添加 2 个。
有什么建议吗?这看起来很简单,但我不确定如何最好地处理它。如果我使用了隐藏字段,你如何在 Ajax.ActionLink 中传递该值并在我的 AjaxAddAddress 方法中读取它?你能以某种方式制作一个本地客户端变量吗?
我想 Session 变量会起作用,但我总是很紧张,不确定它的寿命或可靠性。