2016-02-04 26 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