代码之家  ›  专栏  ›  技术社区  ›  serge

如何通过ASP中的链接发布。净核心

  •  14
  • serge  · 技术社区  · 7 年前

    我试图通过链接发布到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' param,通过eg?

    @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);
    }
    
    4 回复  |  直到 7 年前
        1
  •  17
  •   Chris Pratt    7 年前

    链接是GET请求。你不能通过链接发帖;这就是表格的用途。你需要这样的东西:

    <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>
    

    然后,无论你点击哪个按钮,它的值都会被公布。如果希望它看起来像链接,可以相应地设置按钮的样式。

    或者,您可以保留链接,但需要使用AJAX在单击时发布。

        2
  •  3
  •   Nicolas Pierre    7 年前

    <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);
            }
    

        3
  •  1
  •   EricImhauser    7 年前

    @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>
    
        4
  •  1
  •   Nicolae Lupei    5 年前

    您可以创建一个TagHelper,它以html的形式生成表单,并将要放置的配置作为参数接收。TagHelper示例: TagHelper类:

     [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
    

    Example on Github

    我没有使用它,我只是带着一个意见来的

    你可以继承自 AnchorTagHelper