2016-02-04 22 views
0

更新:错误隐藏提起值被传递到操作方法

这是它具有的js文件还支持提交button.So的SPA app.So我认为问题是出在你it.Could告诉我如何修改它以支持多种提交按钮?在这一刻,我认为它只支持一个提交按钮。这就是为什么它总是会得到我想的第一个窗体的隐藏字段值。谢谢。

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

enter image description here

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

CompanyLoginFormViewModel VM:

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

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

    } 

* .cshtml网页

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

    @foreach (var tenant in companyLoginFormViewModel.Tenants) 
       { 
        <form class="login-form" action="@Url.Action("Login")[email protected]" 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> 
       } 

生成的HTML

 <form class="login-form" action="/Account/Login?returnUrl=/Application" name="companyLoginForm" method="post" novalidate="novalidate"> 
     <input type="hidden" name="usernameOrEmailAddress" value="[email protected]"> 
      <input type="hidden" name="password" value="fake"> 
      <input type="hidden" name="rememberMe" value="true"> 
      <input type="hidden" name="companyUrl" value="true"> 
      <input type="hidden" name="tenancyName" value="Asset_Management"> 

      <div class="row margin-top-10"> 
       <div class="col-xs-3"> 
        <button type="submit" class="btn btn-success uppercase">Log in</button> 
       </div> 
      </div> 
     </form> 
     <form class="login-form" action="/Account/Login?returnUrl=/Application" name="companyLoginForm" method="post" novalidate="novalidate"> 
    <input type="hidden" name="usernameOrEmailAddress" value="[email protected]"> 
      <input type="hidden" name="password" value="fake"> 
      <input type="hidden" name="rememberMe" value="true"> 
      <input type="hidden" name="companyUrl" value="true"> 
      <input type="hidden" name="tenancyName" value="Associates"> 

      <div class="row margin-top-10"> 
       <div class="col-xs-3"> 
        <button type="submit" class="btn btn-success uppercase">Log in</button> 
       </div> 
       </div> 
     </form> 
     <form class="login-form" action="/Account/Login?returnUrl=/Application" name="companyLoginForm" method="post" novalidate="novalidate"> 
<input type="hidden" name="usernameOrEmailAddress" value="[email protected]"> 
     <input type="hidden" name="password" value="fake"> 
      <input type="hidden" name="rememberMe" value="true"> 
      <input type="hidden" name="companyUrl" value="true"> 
      <input type="hidden" name="tenancyName" value="ALL"> 

      <div class="row margin-top-10"> 
       <div class="col-xs-3"> 
        <button type="submit" class="btn btn-success uppercase">Log in</button> 
       </div> 
      </div> 
     </form> 

帖子方法

[HttpPost]  
    public virtual async Task<JsonResult> Login(LoginViewModel loginModel, string returnUrl = "", string returnUrlHash = "", bool companyUrl = false) 
    { 
      CheckModelState(); 
      // removed for clarity 
    } 

问:,即使我有按第二提交按钮,它总是发送tenancyName作为第一个提交按钮的value.That是Asset_Management .Could你告诉我,为什么?谢谢。

+0

我建议改变的逻辑和合并这些投入1

FailedUnitTest

+0

因为你有无效的HTML(嵌套表格)。你想达到什么目的? “LoginViewModel”有多种形式,你只能提交一个。 –

+0

@StephenMuecke请参阅应用程序的用户界面。这是一个登录页面。 – Sampath

回答

1

你的问题是与脚本。

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

是所有形式的集合,而是

data: $loginForm.serialize(), 

将只序列的第一个,让你随时发布第一种形式的瓦莱斯。修改脚本来处理按钮.click()事件,并得到了相关的形式

$('.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

为什么你甚至有<form><button>呢? 为什么不建立在你的foreach循环链接,这样的事情:

@Html.ActionLink("Login for " + tenant.Name, "LoginAction", new {Id=tenant.Id}) 

可以样式这些链接的所有蓝色和漂亮,你喜欢使用CSS之后。

Update1,您可以使用匿名对象将参数传递给您的控制器。你看到我是如何通过Id吗?你的行动将需要接受身份证,看到这个答案:passing multiple parameters in @html.actionlink()

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

+0

如何发送其他表单属性?其他隐藏的字段值? – Sampath

+0

我需要发送电子邮件,密码等。 – Sampath

+0

已更新的答案。 – FailedUnitTest