如何解决向InsertionMode枚举添加其他值
如何为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(是第一个值)。
解决方法
由于缺少您所要询问的功能(enum
的继承)(注释(here和here中已指出),也许其他方法可以提供解决方法完成您的预期任务。
在声明here时(这可能最好放在OP中),您的意思是插入行或将行追加到表中。 因此,您可以在
所示的两步方法中找到(部分?)解决方法 ,如您所知,无法扩展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",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",new AjaxOptions
{
HttpMethod = "GET",InsertionMode = InsertionMode.Replace,OnComplete = "prependToTable('#tableOfDoubles','#myAjaxData');"
});
@Ajax.ActionLink("Append To Table",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调用,使用上面的函数将响应添加到表中
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。