asp.net MVC 4 publicación múltiple a través de diferentes formas

Ahora entiendo

if (IsPost){ //do stuff } 

verifica todos los métodos de publicación en esa página. Sin embargo, tengo 2 formularios diferentes que publican 2 información diferente. Estos son un formulario de inicio de sesión y un formulario de registro.

¿Hay alguna manera de verificar IsPost en función de qué forma? Por ejemplo,

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

pero ¿cómo definiría la variable de inicio de sesión? Mi formulario se ve así:

 

Yo he tratado:

 var Login = Form.["Login"] 

No funcionó.

Apreciaré cualquier ayuda.

Gracias.

En una vista de MVC, puede tener tantos formularios como tantos campos como necesite. Para hacerlo simple, use un modelo de vista única con todas las propiedades que necesita en la página para cada formulario. Tenga en cuenta que solo tendrá acceso a los datos del campo de formulario desde el formulario que envíe. Entonces, si tiene un formulario de inicio de sesión y un formulario de registro en la misma página, lo haría así:

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)  } @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)  

}

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 } 

No olvide, al llamar a BeginForm, pasa el nombre del Controlador sin “Controlador” adjunto:

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

en lugar de:

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

Solo cargaría una vista parcial (que contiene un formulario) para cada formulario necesario, dando a cada elemento un modelo de vista diferente:

  • Requisito de formulario múltiple en una página: satisfecho.
  • Validación JavaScript discreta en cada formulario: logrado.

Debería hacer que cada

señale una acción separada con sus propios parámetros de modelo.

En lugar de enviar un formulario Enviar, podemos hacer una publicación ajax al hacer clic en el botón enviar correspondiente.

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

Una vez que asigna diferentes atributos de id. A cada uno de los formularios de su página, use un código como este:

 $(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 ); } } ); } ); } 

Repita lo mismo en el segundo clic del evento de clic para invocar la publicación de Ajax para el segundo formulario.

Este código usa .serialize () para extraer los datos relevantes del formulario.

Para referencia futura, los documentos jQuery son muy, muy buenos.

NB: ¡El botón que está utilizando para activar el evento que causa el envío del formulario a través de una publicación de Ajax no debe ser del tipo enviar ! De lo contrario, esto siempre fallará.

Utilice este ejemplo para evitar comprobaciones de validación innecesarias / involuntarias al usar varios envíos de formularios con diferentes acciones del controlador.

Qué buscar

  • Esencialmente, este código utiliza un Booleano dentro del Modelo para indicar a qué Acción del Controlador se llamó en la Publicación del formulario.
  • Observe el uso del modelo de anidación y las propiedades booleanas [Is Action Login] y [Is Action Register] que establezco utilizando el método helper IsActionLogin () y IsActionRegister (). Solo se llamará a uno en la respectiva Acción del Controlador.
  • Observe la propiedad sReturnURL en el modelo. Esta propiedad almacena la URL de navegación anterior y se comparte con las Acciones del Controlador de inicio de sesión y del Registro. Esto nos permitirá regresar a la página que el usuario dejó antes de tener que iniciar sesión.


     /* 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)  } @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) }  } } /*End View Logic*/