如何为InsertionMode枚举添加其他值?
我尝试过
public class MyAjaxOptions : AjaxOptions
{
public new InsertionModeCustom InsertionMode;
}
public enum InsertionModeCustom
{
Replace = 0,
InsertBefore = 1,
InsertAfter = 2,
ReplaceWith = 3,
AppendTo = 4,
PrependTo = 5
}
但是,一旦将MyAjaxOptions传递给Ajax.ActionLink,则将MyAjaxOptions强制转换回System.Web.Mvc.Ajax.AjaxOptions,因此InsertionMode不是枚举InsertionModeCustom,而是返回枚举InsertionMode。由于AppendTo和PrependTo不再存在,因此该值变为Replace(是第一个值)。
答案 0 :(得分:1)
由于缺少您所要询问的功能(enum
的继承)(注释(here和here中已指出),也许其他方法可以提供解决方法完成您的预期任务。
在声明here时(这可能最好放在OP中),您的意思是插入行或将行追加到表中。 因此,您可以在
所示的两步方法中找到(部分?)解决方法答案 1 :(得分:0)
如您所知,无法扩展InsertionMode
接受的ActionLink
枚举。
也就是说,如果您重新检查核心问题,则不必尝试解决该问题。
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调用,使用上面的函数将响应添加到表中