javascript - 使用 Html.BeginFrom 在 ASP.Net MVC 中提交带有 anchor (<a>) 标记的表单

标签 javascript jquery asp.net asp.net-mvc asp.net-mvc-4

我正在使用 Html.BeginFrom ... 创建一个 from Tag 和 Submit 请求以使用外部登录提供商。

Account Controller 中的 HttpPost 操作

//
// POST: /Account/ExternalLogin

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult ExternalLogin(string provider, string returnUrl)
{
    return new ExternalLoginResult(provider, Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl }));
}

我需要将 RetunUrl 和 Provider 发送到上面的操作方法 目前我正在使用 ForeachRazor

创建多个表单
@foreach (ExternalLoginViewModel loginViewModel in Model)
{
    using (Html.BeginForm("ExternalLogin", "Account", new { Provider = loginViewModel.AuthenticationClientData.DisplayName, ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post))
    {
        @Html.AntiForgeryToken()
        <a class="@loginViewModel.AnchorCssClass" style="@loginViewModel.AnchorCssStyle" href="#">
            <div class="@loginViewModel.DivCssClass" style="@loginViewModel.DivCssStyle">
                <span aria-hidden="true" class="@loginViewModel.IconCssClass"></span>
            </div>
        </a>
    }
}  

但我认为可以使用单个 from 来完成,但我不知道如何提供随 anchorTag 变化的 Provider 值,例如:

using (Html.BeginForm("ExternalLogin", "Account", new { Provider = "<SomeValue>", ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post))
{
        @Html.AntiForgeryToken()
        @foreach (ExternalLoginViewModel loginViewModel in Model)
        {
             <a class="@loginViewModel.AnchorCssClass" style="@loginViewModel.AnchorCssStyle" href="#">
                <div class="@loginViewModel.DivCssClass" style="@loginViewModel.DivCssStyle">
                    <span aria-hidden="true" class="@loginViewModel.IconCssClass"></span>
                 </div>
            </a>
        }

 }

早期案例中使用的 Javascript 是(它工作正常)

<script type="text/javascript">
    $(document).ready(function() {
        $(document).on("click", ".CSSclassonAnchor", function (e) {
            e.preventDefault();
            var form = $(this).closest("form");
            form.submit();
        });
    });
</script> 

我认为使用 anchor 标记以某种方式发布数据是可能的 在这方面的任何帮助都会很棒..谢谢

最佳答案

一种方法是向表单添加一个隐藏字段,并从 javascript 填充它。在您的 View 中,将 BeginForm 修改为不包含 Provider 参数并添加 <input type="hidden" />形式:

using (Html.BeginForm("ExternalLogin", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post))
{
    @Html.AntiForgeryToken()
    @Html.Hidden("Provider", "", new {id=hdnprovider})
    @foreach (ExternalLoginViewModel loginViewModel in Model)
    {
         <a class="@loginViewModel.AnchorCssClass" style="@loginViewModel.AnchorCssStyle" href="#" data-name="@loginViewModel.AuthenticationClientData.DisplayName">
            <div class="@loginViewModel.DivCssClass" style="@loginViewModel.DivCssStyle">
                <span aria-hidden="true" class="@loginViewModel.IconCssClass"></span>
             </div>
        </a>
    }
 }

然后在 Javascript 中使用点击链接的数据名称属性并将其分配给隐藏:

$(document).ready(function() {
    $('a[data-name]').click(function (e) {
        e.preventDefault();
        var form = $(this).closest("form");
        $("#hdnprovider").val($(this).data("Name"));
        form.submit();
    });
});

由于隐藏项的名称为“Provider”,它将自动绑定(bind)到 Controller 中的“Provider”参数。

关于javascript - 使用 Html.BeginFrom 在 ASP.Net MVC 中提交带有 anchor (<a>) 标记的表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20583249/

相关文章:

javascript - 如何在 jquery 中切换除选定元素之外的所有元素

javascript - 当选中复选框时,如何在金额值之前显示美元符号?

javascript - 如何在jquery中将数组列表分成两个变量

javascript - 如何将值传递给 Bootstrap Modal 的 href 链接?

javascript - 寻找一行类型转换 Number(oldValue) += 1;在JS中

javascript - 检测 iframe 何时开始加载新 URL

javascript - SignalR 集线器 : JavaScript runtime error: Unable to get property 'multipleFileHub' of undefined or null reference

c# - 从经典 ASP 到 ASP.NET 的代码转换

c# - 如何防止搜索引擎缓存提供的自定义处理程序 "text/plain"类型

javascript - 从数组中删除未定义的值