@Ajax.ActionLink 在 ASP.NET 5 MVC6
@Ajax.ActionLink in ASP.NET 5 MVC6
我正在使用 ASP.NET 5 RC1。
ASP.NET 5
MVC 6
与 @Ajax.ActionLink
的等价物是什么
示例:
@Ajax.ActionLink("Show",
"Show",
null,
new AjaxOptions { HttpMethod = "GET",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "dialog_window_id",
OnComplete = "your_js_function();" })
用于 ASP.NET 4
MVC 5
.
我得到:
The name 'Ajax' does not exist in the current context.
在ASP.NET 5
更新:
我知道它不会被实施。是否有人可以向我提供 taghelper 代码示例替代方案?
AjaxHelper
未在 ASP.NET 5 中实施 GitHub issue。
根据 ASP.NET 团队的评论,他们似乎想将它包含在一个版本中,但他们没有时间去做。
说明
我会在这里说它不是一个帮手。
这是一个组件。它不仅是 HTML,而且是 JavaScript。将 JavaScript 绑定到组件后,您使用的是哪个框架?您使用的是纯 JavaScript 吗?
如果此组件绑定到纯 JavaScript(没有 jQuery),则每个浏览器的所有当前、以前和未来版本都需要 updated/tested。
这就是为什么我认为它是作为一个组件构建的,而不是构建到框架本身中的。
移动的部分太多,对 frameworks/software 的依赖太多,客户端可以而且将会更改。
解决方案
至于解决方案,我的建议是使用 jQuery 或类似的方法。
HTML
<a class="ajaxLink" href="#" data-href="/Project" data-method="DELETE">Delete Project</a>
JavaScript
$(document).ready(function() {
$("a.ajaxLink").on('click', function (){
var self = this;
$.ajax({
type: $(this).attr('data-method'),
url: $(this).attr('data-href')
}).then(function() {
// success callback
});
});
});
如您所见,这很容易成为一个简单的客户端解决方案,而不是服务器端解决方案。
我希望这能回答您的问题并解决您的问题。
您可以使用带 data_ajax 参数的常规 html 助手,如下所示:
@Html.ActionLink("Link title", "Action", "Controller", null, new
{
data_ajax = "true",
data_ajax_method = "GET",
data_ajax_mode = "replace",
data_ajax_update = "#update-container"
})
MVC 5 剃刀语法
@Ajax.ActionLink(" ", "Edit", new { id = Model[i].RoleID },
new AjaxOptions { UpdateTargetId = "partial-render",
InsertionMode = InsertionMode.Replace, HttpMethod = "GET" },
new { @class = "glyphicon glyphicon-pencil btn-sm approved", })
<a asp-action="Edit" asp-controller="Account" asp-route-area="Global"
asp-route-id="@item.RoleID "
data-ajax="true" data-ajax-method="GET"
data-ajax-mode="replace"
data-ajax-update="#partial-render"
class="glyphicon
glyphicon-pencil btn-sm"></a>
@Ajax.ActionLink(" ", "Edit", new { id = Model[i].RoleID }, new AjaxOptions { UpdateTargetId = "ze-partial-render", InsertionMode = InsertionMode.Replace, HttpMethod = "GET" }, new { @class = "glyphicon glyphicon-pencil btn-sm approved", })
<a asp-action="Edit" asp-controller="Account" asp-route-area="Global" asp-route-id="@item.RoleID " data-ajax="true" data-ajax-method="GET" data-ajax-mode="replace" data-ajax-update="#ze-partial-render" class="glyphicon glyphicon-pencil btn-sm"></a>
我发现这里的其他答案非常有帮助,所以我从他们那里借来了一些帮助代码来简化过渡,同时我最终在这个项目上从 Unobtrusive AJAX 迁移。
虽然我可以创建类似 Html.AjaxActionLink 的方法,但我查看了该方法所具有的愚蠢的重载数量,并表示对于一个小项目来说,这将是一个可维护性混乱。因此,我创建了一个名为 AjaxOptions 的小 DTO,我可以将其传递给 Html.ActionLink 方法。首先,这是 DTO...
public sealed class AjaxOptions
{
public HttpMethod HttpMethod { get; set; } = HttpMethod.Get;
//public InsertionMode InsertionMode { get; set; } // I left this out because my code only ever uses Replace
public string UpdateTargetId { get; set; }
public string OnBegin { get; set; }
public string OnSuccess { get; set; }
public string OnComplete { get; set; }
public object ToAttrs(object htmlAttributes = null)
{
var dictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
dictionary["data-ajax"] = "true";
dictionary["data-ajax-method"] = HttpMethod.ToString().ToUpper();
if (UpdateTargetId != null)
{
dictionary["data-ajax-mode"] = "replace";
dictionary["data-ajax-update "] = '#' + UpdateTargetId;
}
if (OnBegin != null)
dictionary["data-ajax-begin"] = OnBegin;
if (OnSuccess != null)
dictionary["data-ajax-success"] = OnSuccess;
if (OnComplete != null)
dictionary["data-ajax-complete"] = OnComplete;
return dictionary;
}
}
这让我可以像这样对 Html.ActionLink 进行很好的调用...
@(Html.ActionLink("Add Endorsement", "_CreateEndorsement", new { certificateId = Model.Id },
new AjaxOptions { UpdateTargetId = "modal-content", OnSuccess = "OnEditModalOpened" }
.ToAttrs(new { id = "create-endorsmeent-link" })))
不得不调用 .ToAttrs 可能看起来有点矫揉造作,但我看了看用动态和匿名对象做的花哨的东西,我很快得出结论这是更干净的解决方案,特别是考虑到我希望把所有这些都扔掉接下来几个月支持“适当的”AJAX 调用。
注意:重新使用此代码时,请注意硬编码选项,并根据需要为您的代码调整它们。我没有涵盖原始 AjaxOptions class!
中存在的所有可能选项(属性)
@Ajax.ActionLink("Verify", "VeriFyPackage", "Admin", new { RequestID = item.RequestID }, new AjaxOptions { UpdateTargetId = "getpackage" }, new { @class = "btn btn-success" })
我正在使用 ASP.NET 5 RC1。
ASP.NET 5
MVC 6
与 @Ajax.ActionLink
示例:
@Ajax.ActionLink("Show",
"Show",
null,
new AjaxOptions { HttpMethod = "GET",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "dialog_window_id",
OnComplete = "your_js_function();" })
用于 ASP.NET 4
MVC 5
.
我得到:
The name 'Ajax' does not exist in the current context.
在ASP.NET 5
更新:
我知道它不会被实施。是否有人可以向我提供 taghelper 代码示例替代方案?
AjaxHelper
未在 ASP.NET 5 中实施 GitHub issue。
根据 ASP.NET 团队的评论,他们似乎想将它包含在一个版本中,但他们没有时间去做。
说明
我会在这里说它不是一个帮手。
这是一个组件。它不仅是 HTML,而且是 JavaScript。将 JavaScript 绑定到组件后,您使用的是哪个框架?您使用的是纯 JavaScript 吗?
如果此组件绑定到纯 JavaScript(没有 jQuery),则每个浏览器的所有当前、以前和未来版本都需要 updated/tested。
这就是为什么我认为它是作为一个组件构建的,而不是构建到框架本身中的。
移动的部分太多,对 frameworks/software 的依赖太多,客户端可以而且将会更改。
解决方案
至于解决方案,我的建议是使用 jQuery 或类似的方法。
HTML
<a class="ajaxLink" href="#" data-href="/Project" data-method="DELETE">Delete Project</a>
JavaScript
$(document).ready(function() {
$("a.ajaxLink").on('click', function (){
var self = this;
$.ajax({
type: $(this).attr('data-method'),
url: $(this).attr('data-href')
}).then(function() {
// success callback
});
});
});
如您所见,这很容易成为一个简单的客户端解决方案,而不是服务器端解决方案。
我希望这能回答您的问题并解决您的问题。
您可以使用带 data_ajax 参数的常规 html 助手,如下所示:
@Html.ActionLink("Link title", "Action", "Controller", null, new
{
data_ajax = "true",
data_ajax_method = "GET",
data_ajax_mode = "replace",
data_ajax_update = "#update-container"
})
MVC 5 剃刀语法
@Ajax.ActionLink(" ", "Edit", new { id = Model[i].RoleID },
new AjaxOptions { UpdateTargetId = "partial-render",
InsertionMode = InsertionMode.Replace, HttpMethod = "GET" },
new { @class = "glyphicon glyphicon-pencil btn-sm approved", })
<a asp-action="Edit" asp-controller="Account" asp-route-area="Global"
asp-route-id="@item.RoleID "
data-ajax="true" data-ajax-method="GET"
data-ajax-mode="replace"
data-ajax-update="#partial-render"
class="glyphicon
glyphicon-pencil btn-sm"></a>
@Ajax.ActionLink(" ", "Edit", new { id = Model[i].RoleID }, new AjaxOptions { UpdateTargetId = "ze-partial-render", InsertionMode = InsertionMode.Replace, HttpMethod = "GET" }, new { @class = "glyphicon glyphicon-pencil btn-sm approved", })
<a asp-action="Edit" asp-controller="Account" asp-route-area="Global" asp-route-id="@item.RoleID " data-ajax="true" data-ajax-method="GET" data-ajax-mode="replace" data-ajax-update="#ze-partial-render" class="glyphicon glyphicon-pencil btn-sm"></a>
我发现这里的其他答案非常有帮助,所以我从他们那里借来了一些帮助代码来简化过渡,同时我最终在这个项目上从 Unobtrusive AJAX 迁移。
虽然我可以创建类似 Html.AjaxActionLink 的方法,但我查看了该方法所具有的愚蠢的重载数量,并表示对于一个小项目来说,这将是一个可维护性混乱。因此,我创建了一个名为 AjaxOptions 的小 DTO,我可以将其传递给 Html.ActionLink 方法。首先,这是 DTO...
public sealed class AjaxOptions
{
public HttpMethod HttpMethod { get; set; } = HttpMethod.Get;
//public InsertionMode InsertionMode { get; set; } // I left this out because my code only ever uses Replace
public string UpdateTargetId { get; set; }
public string OnBegin { get; set; }
public string OnSuccess { get; set; }
public string OnComplete { get; set; }
public object ToAttrs(object htmlAttributes = null)
{
var dictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
dictionary["data-ajax"] = "true";
dictionary["data-ajax-method"] = HttpMethod.ToString().ToUpper();
if (UpdateTargetId != null)
{
dictionary["data-ajax-mode"] = "replace";
dictionary["data-ajax-update "] = '#' + UpdateTargetId;
}
if (OnBegin != null)
dictionary["data-ajax-begin"] = OnBegin;
if (OnSuccess != null)
dictionary["data-ajax-success"] = OnSuccess;
if (OnComplete != null)
dictionary["data-ajax-complete"] = OnComplete;
return dictionary;
}
}
这让我可以像这样对 Html.ActionLink 进行很好的调用...
@(Html.ActionLink("Add Endorsement", "_CreateEndorsement", new { certificateId = Model.Id },
new AjaxOptions { UpdateTargetId = "modal-content", OnSuccess = "OnEditModalOpened" }
.ToAttrs(new { id = "create-endorsmeent-link" })))
不得不调用 .ToAttrs 可能看起来有点矫揉造作,但我看了看用动态和匿名对象做的花哨的东西,我很快得出结论这是更干净的解决方案,特别是考虑到我希望把所有这些都扔掉接下来几个月支持“适当的”AJAX 调用。
注意:重新使用此代码时,请注意硬编码选项,并根据需要为您的代码调整它们。我没有涵盖原始 AjaxOptions class!
中存在的所有可能选项(属性)@Ajax.ActionLink("Verify", "VeriFyPackage", "Admin", new { RequestID = item.RequestID }, new AjaxOptions { UpdateTargetId = "getpackage" }, new { @class = "btn btn-success" })