如何通过 ASP.NET 核心中的 link POST
How to POST via a link in ASP.NET Core
我尝试通过 link POST 到 SetLanguage 操作,但不确定如何完成以下代码:
<form id="selectLanguage" asp-controller="Home" asp-action="SetLanguage" asp-route-returnUrl="@Context.Request.Path" method="post" role="form">
@foreach (var culture in cultures) {
<div>
<a href="?culture=@culture.Name">@culture.Name</a>
</div>
}
</form>
我应该使用 form
还是有一个直接的方法来发送带有 culture : 'EN'
参数的 POST,例如?
@Url.Action(action: "SetLanguage", controller:"Home", values: new { culture = culture.Name }, protocol:"POST")
能做到吗?
我的控制器代码是
[HttpPost]
public IActionResult SetLanguage(string culture, string returnUrl)
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
);
return LocalRedirect(returnUrl);
}
我会在链接本身上使用操作,我在我的项目中使用了这段特定的代码。它就像一个魅力。
<a asp-controller="YourController"
asp-action="SetLanguage"
asp-route-culture="@culture.Name"
asp-route-returnUri="@Context.Request.Path">
</a>
我的控制器代码看起来像这样:
public IActionResult SetLanguage(string culture, string returnUri = "")
{
SetSettings(newCultureName);
return Redirect(returnUri);
}
希望这对您的项目有所帮助!
链接是 GET 请求。您不能通过 link 来 post;这就是表格的用途。你需要这样的东西:
<form id="selectLanguage" asp-controller="Home" asp-action="SetLanguage" asp-route-returnUrl="@Context.Request.Path" method="post" role="form">
@foreach (var culture in cultures) {
<div>
<button type="submit" name="culture" value="@culture.Name">
@culture.Name
</button>
</div>
}
</form>
然后,无论您单击哪个按钮,其值都将被 posted。如果您希望它看起来像 links,您可以相应地设置按钮样式。
或者,您可以保留 link,但您需要在点击时使用 AJAX 到 post。
您可以使用 JQuery :
@foreach (var culture in cultures)
{
<div>
<a href="javascript:setLanguage('@culture.Name')">@culture.Name</a>
</div>
}
<script type="text/javascript">
function setLanguage(culture)
{
$.post("/home/setlanguage", { culture: culture})
.done(function (data) {
location.reload();
});
}
</script>
您可以创建一个生成表单的 TagHelper html 并接收您要放置的配置作为参数。 TagHelper 示例:
TagHelper class:
[HtmlTargetElement("HyperLink")]
public class HyperLinkTagHelper : TagHelper
{
#region Proprietes
public string AspAction { get; set; }
public string AspController { get; set; }
public Method Method { get; set; } = Method.Get;
public string Class { get; set; }
public string Style { get; set; }
private IDictionary<string, string> _routeValues;
[HtmlAttributeName("asp-all-route-data", DictionaryAttributePrefix = "asp-route-")]
public IDictionary<string, string> RouteValues
{
get => _routeValues ??= new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
set => _routeValues = value;
}
#endregion
#region Injectable
private readonly IUrlHelper _urlHelper;
#endregion
/// <summary>
/// Constructor
/// </summary>
/// <param name="urlHelper"></param>
public HyperLinkTagHelper(IUrlHelper urlHelper)
{
_urlHelper = urlHelper;
}
/// <summary>
/// Render output
/// </summary>
/// <param name="context"></param>
/// <param name="output"></param>
/// <returns></returns>
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
output.TagMode = TagMode.StartTagAndEndTag;
var linkName = (await output.GetChildContentAsync()).GetContent();
var builder = new StringBuilder();
var method = Method.ToString().ToLower();
var link = _urlHelper.Action(AspAction, AspController);
builder.AppendFormat("<form method='{0}' role='form' action='{1}'>", method, link);
foreach (var (key, value) in _routeValues)
{
builder.AppendFormat("<input type='hidden' name='{0}' value='{1}'>", key, value);
}
builder.AppendFormat("<input type='submit' value='{0}' class='{1}' style='{2}'/>", linkName, Class, Style);
builder.Append("</form>");
output.Content.SetHtmlContent(builder.ToString());
}
}
用法:
<HyperLink asp-action="SendData" asp-controller="Default" method="Post" asp-route-data="test">Send data</HyperLink>
控制器:
public class DefaultController : Controller
{
public IActionResult Index()
{
return View();
}
[HttpPost]
public IActionResult SendData(string data)
{
Console.WriteLine(data);
return RedirectToAction("Index");
}
}
方法:
public enum Method
{
Get,
Post,
Delete,
Put
}
报名人数:
@addTagHelper HyperLinkTagHelper.TagHelpers.HyperLinkTagHelper, HyperLinkTagHelper
我没用过,只是提意见
可以继承AnchorTagHelper并重写Process方法
我尝试通过 link POST 到 SetLanguage 操作,但不确定如何完成以下代码:
<form id="selectLanguage" asp-controller="Home" asp-action="SetLanguage" asp-route-returnUrl="@Context.Request.Path" method="post" role="form">
@foreach (var culture in cultures) {
<div>
<a href="?culture=@culture.Name">@culture.Name</a>
</div>
}
</form>
我应该使用 form
还是有一个直接的方法来发送带有 culture : 'EN'
参数的 POST,例如?
@Url.Action(action: "SetLanguage", controller:"Home", values: new { culture = culture.Name }, protocol:"POST")
能做到吗?
我的控制器代码是
[HttpPost]
public IActionResult SetLanguage(string culture, string returnUrl)
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
);
return LocalRedirect(returnUrl);
}
我会在链接本身上使用操作,我在我的项目中使用了这段特定的代码。它就像一个魅力。
<a asp-controller="YourController"
asp-action="SetLanguage"
asp-route-culture="@culture.Name"
asp-route-returnUri="@Context.Request.Path">
</a>
我的控制器代码看起来像这样:
public IActionResult SetLanguage(string culture, string returnUri = "")
{
SetSettings(newCultureName);
return Redirect(returnUri);
}
希望这对您的项目有所帮助!
链接是 GET 请求。您不能通过 link 来 post;这就是表格的用途。你需要这样的东西:
<form id="selectLanguage" asp-controller="Home" asp-action="SetLanguage" asp-route-returnUrl="@Context.Request.Path" method="post" role="form">
@foreach (var culture in cultures) {
<div>
<button type="submit" name="culture" value="@culture.Name">
@culture.Name
</button>
</div>
}
</form>
然后,无论您单击哪个按钮,其值都将被 posted。如果您希望它看起来像 links,您可以相应地设置按钮样式。
或者,您可以保留 link,但您需要在点击时使用 AJAX 到 post。
您可以使用 JQuery :
@foreach (var culture in cultures)
{
<div>
<a href="javascript:setLanguage('@culture.Name')">@culture.Name</a>
</div>
}
<script type="text/javascript">
function setLanguage(culture)
{
$.post("/home/setlanguage", { culture: culture})
.done(function (data) {
location.reload();
});
}
</script>
您可以创建一个生成表单的 TagHelper html 并接收您要放置的配置作为参数。 TagHelper 示例: TagHelper class:
[HtmlTargetElement("HyperLink")]
public class HyperLinkTagHelper : TagHelper
{
#region Proprietes
public string AspAction { get; set; }
public string AspController { get; set; }
public Method Method { get; set; } = Method.Get;
public string Class { get; set; }
public string Style { get; set; }
private IDictionary<string, string> _routeValues;
[HtmlAttributeName("asp-all-route-data", DictionaryAttributePrefix = "asp-route-")]
public IDictionary<string, string> RouteValues
{
get => _routeValues ??= new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
set => _routeValues = value;
}
#endregion
#region Injectable
private readonly IUrlHelper _urlHelper;
#endregion
/// <summary>
/// Constructor
/// </summary>
/// <param name="urlHelper"></param>
public HyperLinkTagHelper(IUrlHelper urlHelper)
{
_urlHelper = urlHelper;
}
/// <summary>
/// Render output
/// </summary>
/// <param name="context"></param>
/// <param name="output"></param>
/// <returns></returns>
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
output.TagMode = TagMode.StartTagAndEndTag;
var linkName = (await output.GetChildContentAsync()).GetContent();
var builder = new StringBuilder();
var method = Method.ToString().ToLower();
var link = _urlHelper.Action(AspAction, AspController);
builder.AppendFormat("<form method='{0}' role='form' action='{1}'>", method, link);
foreach (var (key, value) in _routeValues)
{
builder.AppendFormat("<input type='hidden' name='{0}' value='{1}'>", key, value);
}
builder.AppendFormat("<input type='submit' value='{0}' class='{1}' style='{2}'/>", linkName, Class, Style);
builder.Append("</form>");
output.Content.SetHtmlContent(builder.ToString());
}
}
用法:
<HyperLink asp-action="SendData" asp-controller="Default" method="Post" asp-route-data="test">Send data</HyperLink>
控制器:
public class DefaultController : Controller
{
public IActionResult Index()
{
return View();
}
[HttpPost]
public IActionResult SendData(string data)
{
Console.WriteLine(data);
return RedirectToAction("Index");
}
}
方法:
public enum Method
{
Get,
Post,
Delete,
Put
}
报名人数:
@addTagHelper HyperLinkTagHelper.TagHelpers.HyperLinkTagHelper, HyperLinkTagHelper
我没用过,只是提意见
可以继承AnchorTagHelper并重写Process方法