Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 传递给操作方法的隐藏字段值错误_C#_Asp.net Mvc - Fatal编程技术网

C# 传递给操作方法的隐藏字段值错误

C# 传递给操作方法的隐藏字段值错误,c#,asp.net-mvc,C#,Asp.net Mvc,更新: public class CompanyLoginFormViewModel { public LoginViewModel LoginViewModel { get; set; } public List<TenantListDto> Tenants { get; set; } } 这是一个SPA应用程序。所以它的js文件也支持提交按钮。所以我认为问题在于它。你能告诉我如何修改它以支持多种提交按钮吗?目前我认为它只支持

更新:

 public class CompanyLoginFormViewModel
    {
        public LoginViewModel LoginViewModel { get; set; }

        public List<TenantListDto> Tenants { get; set; }

    }
这是一个SPA应用程序。所以它的js文件也支持提交按钮。所以我认为问题在于它。你能告诉我如何修改它以支持多种提交按钮吗?目前我认为它只支持一个提交按钮。这就是为什么它总是得到第一个表单的隐藏字段值的原因。谢谢

JS

 var $loginForm = $('.login-form');

 $loginForm.submit(function (e) {
            e.preventDefault();

            if (!$('.login-form').valid()) {
                return;
            }

            abp.ui.setBusy(
                null,
                abp.ajax({
                    contentType: app.consts.contentTypes.formUrlencoded,
                    url: $loginForm.attr('action'),
                    data: $loginForm.serialize()
                })
            );
        });
UI

VM

 public class LoginViewModel
    {
        public string TenancyName { get; set; }

        [Required]
        public string UsernameOrEmailAddress { get; set; }

        [Required]
        public string Password { get; set; }

        public bool RememberMe { get; set; }
    }
公司登录表单视图模型虚拟机:

 public class CompanyLoginFormViewModel
    {
        public LoginViewModel LoginViewModel { get; set; }

        public List<TenantListDto> Tenants { get; set; }

    }
公共类CompanyLoginFormViewModel
{
公共LoginViewModel LoginViewModel{get;set;}
公共列表租户{get;set;}
}
*.cshtml页面

@{
    var companyLoginFormViewModel = TempData["CompanyLoginFormViewModel"] as CompanyLoginFormViewModel;
} 

    @foreach (var tenant in companyLoginFormViewModel.Tenants)
                {
                    <form class="login-form" action="@Url.Action("Login")?returnUrl=@ViewBag.ReturnUrl" name="companyLoginForm" method="post">
    <input type="hidden" name="usernameOrEmailAddress" value="@companyLoginFormViewModel.LoginViewModel.UsernameOrEmailAddress" />
                <input type="hidden" name="password" value="@companyLoginFormViewModel.LoginViewModel.Password" />
                       <input type="hidden" name="rememberMe" value="true" />
                        <input type="hidden" name="companyUrl" value="true" />
                        <input type="hidden" name="tenancyName" value="@tenant.TenancyName" />

                        <div class="row margin-top-10">
                            <div class="col-xs-3">
                                <button type="submit" class="btn btn-success uppercase">@L("LogIn")</button>
                            </div>
                           </div>
                    </form>
                }
@{
var companyLoginFormViewModel=TempData[“companyLoginFormViewModel”]作为companyLoginFormViewModel;
} 
@foreach(companyLoginFormViewModel.Tenants中的var租户)
{
@L(“登录”)
}
生成的html


登录
登录
登录
发布方法

 [HttpPost]      
    public virtual async Task<JsonResult> Login(LoginViewModel loginModel, string returnUrl = "", string returnUrlHash = "", bool companyUrl = false)
   {
             CheckModelState();
            // removed for clarity
    }
[HttpPost]
公共虚拟异步任务登录(LoginViewModel loginModel,string returnUrl=“”,string returnUrlHash=“”,bool companyUrl=false)
{
CheckModelState();
//为清晰起见,请将其删除
}

问题:即使我按了第二个提交按钮,它也会将
租户名称
作为第一个提交按钮的值发送。这就是
资产管理
。你能告诉我为什么吗?谢谢

为什么你甚至有
? 为什么不在foreach循环中创建链接,如下所示:

@Html.ActionLink("Login for " + tenant.Name, "LoginAction", new {Id=tenant.Id})
您可以在以后使用CSS为这些链接设置蓝色和漂亮的样式

更新1,可以使用匿名对象将参数传递给控制器。你知道我是怎么通过身份证的吗?您的操作需要接受id,请参阅以下答案:


像这样传递用户名和密码是非常糟糕的做法。您正在向视图公开安全凭据。您应该将用户转发到带有用户名+密码输入框的登录页面,用户将在其中登录

为什么你甚至有
? 为什么不在foreach循环中创建链接,如下所示:

@Html.ActionLink("Login for " + tenant.Name, "LoginAction", new {Id=tenant.Id})
您可以在以后使用CSS为这些链接设置蓝色和漂亮的样式

更新1,可以使用匿名对象将参数传递给控制器。你知道我是怎么通过身份证的吗?您的操作需要接受id,请参阅以下答案:


像这样传递用户名和密码是非常糟糕的做法。您正在向视图公开安全凭据。您应该将用户转发到带有用户名+密码输入框的登录页面,用户将在其中登录

您的问题在于脚本

var $loginForm = $('.login-form');
是所有表单的集合,但是

data: $loginForm.serialize(),
将只序列化第一个表单,因此您总是发布第一个表单的值。修改脚本以处理按钮
。单击()

$('.btn-success').click(function(e) { 
    e.preventDefault(); // if you makes the button type="button" this is not required
    var form = $(this).closest('.login-form');
    if (!form.valid()) {
        return;
    }
    abp.ui.setBusy(
        null,
        abp.ajax({
            contentType: app.consts.contentTypes.formUrlencoded,
            url: form.attr('action'),
            data: form.serialize()
        })
    );
});

你的问题在于剧本

var $loginForm = $('.login-form');
是所有表单的集合,但是

data: $loginForm.serialize(),
将只序列化第一个表单,因此您总是发布第一个表单的值。修改脚本以处理按钮
。单击()

$('.btn-success').click(function(e) { 
    e.preventDefault(); // if you makes the button type="button" this is not required
    var form = $(this).closest('.login-form');
    if (!form.valid()) {
        return;
    }
    abp.ui.setBusy(
        null,
        abp.ajax({
            contentType: app.consts.contentTypes.formUrlencoded,
            url: form.attr('action'),
            data: form.serialize()
        })
    );
});

我建议更改逻辑并将这些输入合并为1查看您现在发布的UI,我根本不会让这些按钮提交表单。即使是超链接在这里也能很好地工作。@Sampath,您没有嵌套表单(问题现在已被编辑以修复缩进)。虽然现在还不清楚你在这里想要实现什么-你是如何处理安全性的-你没有密码,任何人都可以操纵你隐藏的输入和登录?@Sampath。参考单击第一个按钮,它将返回正确的租赁名称。再次运行它并单击第二个按钮,它再次返回正确的租约名称。问题在于您没有向我们展示的代码:)我们在这里有点偏离了轨道。您显示的代码可以正常工作(除了DotNetFiddle,我已经将它复制到一个测试项目中,它返回正确的
TenantName
,因此它的其他代码您还没有显示这是问题所在。我没有更多的帮助。我建议更改逻辑并将这些输入合并为1查看您现在发布的UI,我不会让这些按钮提交。)一个表单。即使是超链接也可以在这里工作。@Sampath,您没有嵌套表单(问题现在已被编辑以修复缩进)。虽然还不清楚您在这里试图实现什么-您如何处理安全性-您没有密码,任何人都可以操纵您的隐藏输入和登录?@Sampath.reference。单击第一个按钮,它将返回正确的租约名称。再次运行该按钮,然后单击第二个按钮,它将返回正确的租约名称e、 问题在于您没有向我们展示的代码:)我们在这里有点偏离正轨。您展示的代码工作正常(除了DotNetFiddle之外,我已经将其复制到测试项目中,并返回正确的
租户名称<