向InsertionMode枚举添加其他值

时间:2020-09-05 00:17:27

标签: asp.net-mvc

如何为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(是第一个值)。

2 个答案:

答案 0 :(得分:1)

由于缺少您所要询问的功能(enum的继承)(注释(herehere中已指出),也许其他方法可以提供解决方法完成您的预期任务。

在声明here时(这可能最好放在OP中),您的意思是插入行或将行追加到表中。 因此,您可以在

所示的两步方法中找到(部分?)解决方法
  1. Ajax.ActionLink insert after header in a table?

  2. How To add a row to table by ajax actionlink

答案 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库以处理新的AppendToPrependTo选项(不建议)

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调用,使用上面的函数将响应添加到表中