正如您所发现的,无法扩展 ActionLink 接受的 InsertionMode 枚举。
也就是说,如果你重新审视你试图解决的核心问题,那么这种方法就没有必要了。
Ajax.ActionLink 唯一要做的就是生成一个 HTML 锚标记。您可以通过替换无效调用来创建相同的标签(使用您的AppendTo 选项):
@Ajax.ActionLink("Append To Table", "GetRowData",
new AjaxOptions
{
HttpMethod = "GET",
InsertionMode = InsertionMode.AppendTo,
UpdateTargetId = "myAjaxData",
});
与:
@Html.ActionLink("Append To Table", "GetRowData", null,
new {
data_ajax = "true",
data_ajax_method = "GET",
data_ajax_mode = "appendTo",
data_ajax_update = "myAjaxData"
}
);
这会产生与您已经能够扩展枚举相同的锚标记。
就解决方案而言,这只是故事的一半,因为您还需要修改 Unobtrusive JavaScript 库以处理您的新 AppendTo 和 PrependTo 选项(不推荐).
Unobtrusive JavaScript 为每个具有data-ajax="true" 属性的锚标记添加点击处理程序。如果它检测到无效的InsertionMode,它将默认为InsertionMode.Replace。
如果您特别想使用Ajax.ActionLink,一个解决方案是使用其标准功能更新隐藏的 div,然后调用 JS 函数将数据追加/追加到表中:
Index.cshtml:
@Ajax.ActionLink("Prepend To Table", "GetRowData",
new AjaxOptions
{
HttpMethod = "GET",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "myAjaxData",
OnComplete = "prependToTable('#tableOfDoubles', '#myAjaxData');"
});
@Ajax.ActionLink("Append To Table", "GetRowData",
new AjaxOptions
{
HttpMethod = "GET",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "myAjaxData",
OnComplete = "appendToTable('#tableOfDoubles', '#myAjaxData');"
});
<div id="myAjaxData" style="display:none;">
data will end up here
</div>
<table style="border-spacing: 7px; border-collapse: separate;">
<thead>
<tr>
<th>Number</th>
<th>Number doubled</th>
</tr>
</thead>
<tbody id="tableOfDoubles">
<tr>
<td>1</td>
<td>2</td>
</tr>
</tbody>
</table>
JavaScript:
<script type="text/javascript">
function prependToTable(tableId, dataId) {
try {
var newData = JSON.parse($(dataId).text());
var row = ("<tr><td>" + newData.Number + "</td><td>" + newData.Doubled + "</td></tr>");
$(tableId).prepend(row);
} catch (ex) {
console.error(ex);
}
}
function appendToTable(tableId, dataId) {
try {
var newData = JSON.parse($(dataId).text());
var row = ("<tr><td>" + newData.Number + "</td><td>" + newData.Doubled + "</td></tr>");
$(tableId).append(row);
} catch (ex) {
console.error(ex);
}
}
</script>
控制器:
using System.Web.Mvc;
using System.Web.Script.Serialization;
namespace AjaxActionLink.Models
{
public class MyData
{
public int Number { get; set; }
public int Doubled => Number * 2;
}
}
namespace AjaxActionLink.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public string GetRowData()
{
JavaScriptSerializer js = new JavaScriptSerializer();
// generate demo data
int someNumber = (int)(Session["tableRowValue"] ?? 1);
Session["tableRowValue"] = ++someNumber;
// end of data generation
var newData = new MyData { Number = someNumber };
return js.Serialize(newData);
}
}
}
说了这么多,我个人只是将onclick 处理程序添加到标签并使用jQuery(like this)进行ajax 调用,使用我上面的函数将响应添加到表中。