通过不同的forms的asp.net MVC 4多个职位

现在我明白了

if (IsPost){ //do stuff } 

检查该页面上的所有发布方法。 不过,我有两种不同的forms发布2个不同的信息。 这些是login表单和registry单。

有没有一种方法可以检查IsPost基于哪种forms? 例如,

 if(Login.IsPost){ //do stuff } 

但是我将如何定义Loginvariables? 我的表单看起来像:

 <form id="Login" method = "POST"> 

我努力了:

 var Login = Form.["Login"] 

它不起作用。

我将不胜感激任何帮助。

谢谢。

在MVC视图中,可以根据需要使用尽可能多的表单。 为了简单起见,请使用单个视图模型,并在页面上为每个表单使用所需的所有属性。 请记住,您只能从提交的表单中访问表单字段数据。 所以,如果您在同一页面上有login表单和registry单,您可以这样做:

LoginRegisterViewModel.cs

 public class LoginRegisterViewModel { public string LoginUsername { get; set; } public string LoginPassword { get; set; } public string RegisterUsername { get; set; } public string RegisterPassword { get; set; } public string RegisterFirstName { get; set; } public string RegisterLastName { get; set; } } 

YourViewName.cshtml

 @model LoginRegisterViewModel @using (Html.BeginForm("Login", "Member", FormMethod.Post, new {})) { @Html.LabelFor(m => m.LoginUsername) @Html.TextBoxFor(m => m.LoginUsername) @Html.LabelFor(m => m.LoginPassword) @Html.TextBoxFor(m => m.LoginPassword) <input type='Submit' value='Login' /> } @using (Html.BeginForm("Register", "Member", FormMethod.Post, new {})) { @Html.LabelFor(m => m.RegisterFirstName) @Html.TextBoxFor(m => m.RegisterFirstName) @Html.LabelFor(m => m.RegisterLastName) @Html.TextBoxFor(m => m.RegisterLastName) @Html.LabelFor(m => m.RegisterUsername) @Html.TextBoxFor(m => m.RegisterUsername) @Html.LabelFor(m => m.RegisterPassword) @Html.TextBoxFor(m => m.RegisterPassword) <input type='Submit' value='Register' /> 

}

MemberController.cs

 [HttpGet] public ActionResult LoginRegister() { LoginRegisterViewModel model = new LoginRegisterViewModel(); return view("LoginRegister", model); } [HttpPost] public ActionResult Login(LoginRegisterViewModel model) { //do your login code here } [HttpPost] public ActionResult Register(LoginRegisterViewModel model) { //do your registration code here } 

调用BeginForm时,请不要忘记在不带“Controller”的情况下传递控制器名称:

 @using (Html.BeginForm("Login", "Member", FormMethod.Post, new {})) 

代替:

 @using (Html.BeginForm("Login", "MemberController", FormMethod.Post, new {})) 

我只是为每个需要的forms加载一个部分视图(包含一个表单),给每个部分一个不同的viewmodel:

  • 多个表单要求:满意。
  • Javascript在每个表单上的不显眼的validation:完成。

您应该使每个<form>指向一个单独的行为与自己的模型参数。

而不是做一个表单提交,我们可以点击相应的提交button做ajax文章。

 @using (Html.BeginForm("ActionName", "ControllerName", FormMethod.Post, new { @Id = "Form1" })) { } @using (Html.BeginForm("ActionName", "ControllerName", FormMethod.Post, new { @Id = "Form2" })) { } 

一旦为页面中的每个表单分配了不同的id属性,请使用如下所示的代码:

 $(document).ready( function() { var form = $('#Form1'); $('#1stButton').click(function (event) { $.ajax( { type: "POST", url: form.attr( 'action' ), data: form.serialize(), success: function( response ) { console.log( response ); } } ); } ); } 

在2nd Button click事件上重复同样的事情来调用第二个表单的ajax文章。

此代码使用.serialize()从表单中提取相关数据。

为了将来的参考, jQuery文档是非常非常好的。

注意:您用来触发导致通过ajaxpost提交表单的button不应该是提交types的! 否则这将总是失败。

使用此示例可防止在使用具有不同Controller控制器操作的多个Form Post时进行不必要的/意外的validation检查。

要寻找什么

  • 本质上,这段代码利用模型内部的一个布尔值来标记Form Post中的哪个Controller Action被调用。
  • 请注意,我使用方法助手IsActionLogin()和IsActionRegister()设置了嵌套模型和[Is Action Login]和[Is Action Register]布尔属性。 只有一个将在相应的控制器操作中被调用。
  • 注意模型中的sReturnURL属性。 该属性存储以前的导航URL,并与login和注册控制器操作共享。 这将允许我们返回到用户在login之前离开的页面。


     /* Begin Model logic */ public class LoginRegisterModel { public LoginModel LoginModel { get; set; } public RegisterModel RegisterModel { get; set; } public string sReturnURL { get; set; } public bool bIsActionLogin { get; set; } public bool bIsActionRegister { get; set; } public void IsActionLogin() { bIsActionLogin = true; bIsActionRegister = false; } public void IsActionRegister() { bIsActionLogin = false; bIsActionRegister = true; } } public class LoginRegisterModel { public LoginModel LoginModel { get; set; } public RegisterModel RegisterModel { get; set; } public string sReturnURL { get; set; } public bool bIsActionLogin { get; set; } public bool bIsActionRegister { get; set; } public void IsActionLogin() { bIsActionLogin = true; bIsActionRegister = false; } public void IsActionRegister() { bIsActionLogin = false; bIsActionRegister = true; } } public class RegisterModel { [Required] [Display(Name = "Email")] [RegularExpression("^[a-zA-Z0-9_\\.-]+@([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$", ErrorMessage = "Email is not valid.")] public string UserName { get; set; } [Required] [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "Password")] public string Password { get; set; } [Required] [DataType(DataType.Password)] [Display(Name = "Confirm Password")] [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] public string ConfirmPassword { get; set; } } /*End Model logic*/ /*Begin Controller Logic*/ [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public ActionResult Login(LoginRegisterModel model, string sReturnURL) { model.IsActionLogin(); //flags that you are using Login Action //process your login logic here } [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public ActionResult Register(LoginRegisterModel model, string sReturnURL) { model.IsActionRegister(); //flag Action Register action //process your register logic here } /*End Controller Logic*/ /*Begin View Logic*/ @model eCommerce.Models.LoginRegisterModel @{ /*Place this view logic in both the Login.cshtml and Register.cshtml. Now use the last Action called as a Boolean check against your validation messages, so unnecessary validation messages don't show up.*/ bool bLoginCallBack = Model.bIsActionLogin; bool bRegisterCallBack = Model.bIsActionRegister; MvcHtmlString htmlIcoWarn = new MvcHtmlString(" font awesome icon here "); MvcHtmlString htmlIcoHand = new MvcHtmlString(" font awesome icon here "); } @using (Html.BeginForm("Login", "Account", new { sReturnURL = Model.sReturnURL })) { @Html.AntiForgeryToken() if (bLoginCallBack) { MvcHtmlString htmlLoginSummary = Html.ValidationSummary(true); if (!htmlLoginSummary.ToHtmlString().Contains("display:none")) { @:@(htmlIcoWarn)@(htmlLoginSummary) } } @Html.LabelFor(m => m.LoginModel.UserName) @Html.TextBoxFor(m => m.LoginModel.UserName, new { @placeholder = "Email" }) @if (bLoginCallBack) { MvcHtmlString htmlLoginUsername = Html.ValidationMessageFor(m => m.LoginModel.UserName); if (!htmlLoginUsername.ToHtmlString().Contains("field-validation-valid")) { @:@(htmlIcoHand) @(htmlLoginUsername) } } @Html.LabelFor(m => m.LoginModel.Password) @Html.PasswordFor(m => m.LoginModel.Password, new { @placeholder = "Password" }) @if (bLoginCallBack) { MvcHtmlString htmlLoginPassword = Html.ValidationMessageFor(m => m.LoginModel.Password); if (!htmlLoginPassword.ToHtmlString().Contains("field-validation-valid")) { @:@(htmlIcoHand) @(htmlLoginPassword) } } @Html.CheckBoxFor(m => m.LoginModel.RememberMe) @Html.LabelFor(m => m.LoginModel.RememberMe) <button type="submit" class="btn btn-default">Login</button> } @using (Html.BeginForm("Register", "Account", new { sReturnURL = Model.sReturnURL })) { @Html.AntiForgeryToken() if (bRegisterCallBack) { MvcHtmlString htmlRegisterSummary = Html.ValidationSummary(true); if (!htmlRegisterSummary.ToHtmlString().Contains("display:none")) { @:@(htmlIcoWarn)@(htmlRegisterSummary) } } @Html.LabelFor(m => m.RegisterModel.UserName) @Html.TextBoxFor(m => m.RegisterModel.UserName, new { @placeholder = "Email" }) @if (bRegisterCallBack) { MvcHtmlString htmlRegisterUsername = Html.ValidationMessageFor(m => m.RegisterModel.UserName); if (!htmlRegisterUsername.ToHtmlString().Contains("field-validation-valid")) { @:@(htmlIcoHand) @(htmlRegisterUsername) } } @Html.LabelFor(m => m.RegisterModel.Password) @Html.PasswordFor(m => m.RegisterModel.Password, new { @placeholder = "Password" }) @if (bRegisterCallBack) { MvcHtmlString htmlRegisterPassword = Html.ValidationMessageFor(m => m.RegisterModel.Password); if (!htmlRegisterPassword.ToHtmlString().Contains("field-validation-valid")) { @:@(htmlIcoHand) @(htmlRegisterPassword) } } @Html.LabelFor(m => m.RegisterModel.ConfirmPassword) @Html.PasswordFor(m => m.RegisterModel.ConfirmPassword, new { @placeholder = "Confirm Password" }) @if (bRegisterCallBack) { MvcHtmlString htmlRegisterConfirmPassword = Html.ValidationMessageFor(m => m.RegisterModel.ConfirmPassword); if (!htmlRegisterConfirmPassword.ToHtmlString().Contains("field-validation-valid")) { @:@(htmlIcoHand) @(htmlRegisterConfirmPassword) } <button type="submit" class="btn btn-default">Signup</button> } } /*End View Logic*/