2009-05-05 23 views
8

Contexto
Let `Decir que tengo:
En Site.Master diseño:múltiples formas en ASP.NET MVC

<div class="leftColumn"> 
    <asp:ContentPlaceHolder ID="MainContent" runat="server" /> 
</div> 
<div class="rightColumn"> 
    <% Html.RenderPartial("_Login"); %> 
    <asp:ContentPlaceHolder ID="SideContent" runat="server" /> 
</div> 

sesión PartialView parece:

<form action="/myApp/Account/Login" method="post"> 
    <input name="name" />Name<br /> 
    <input name="password" type="password" />Password<br /> 
    <button>Login</button> 
</form> 

Es Es posible actualizar solo el formulario del widget de inicio de sesión, no la página de contenido completa?

Respuesta

15

Si se refiere a una publicación HTTP, solo una publicación iniciada (también puede ser iniciada por javascript) con un botón de envío desde el formulario se publicará en el servidor.

Si sus formularios están anidados, esto no funcionará. La forma externa siempre se publicará en el servidor.

En el código HTML de ejemplo a continuación, al hacer clic en el botón Enviar en el primer formulario no se enviarán los valores del segundo formulario al servidor. Del mismo modo, al hacer clic en el segundo botón de envío no se publicarán los valores del primer formulario.

<html> 
... 
    <body> 
    <div> 

     <form action="/Login/Login" method="post"> 
     <input type="text" name="username" value="" /> 
     <input type="text" name="passowrd" value="" /> 
     <input type="submit" name="login" value="Login" /> 
     </form> 


     <form action="/Login/AdminLogin" method="post"> 
     <input type="text" name="username" value="" /> 
     <input type="text" name="passowrd" value="" /> 
     <input type="submit" name="login" value="Login Admin" /> 
     </form> 
    </div> 
</body> 
</html> 

Si sólo desea actualizar/cambiar una de la sección del formulario, entonces no esto no se puede hacer sin necesidad de utilizar JavaScript y la realización de un puesto de Javascript (también conocido como Ajax).

+1

Yay ... A pesar de que la pregunta seguramente no estaba clara, esto es exactamente lo que quería escuchar: "Si solo deseas actualizar/cambiar una de las secciones del formulario, entonces esto no se puede hacer sin usar". Hasta ahora, parece que no hay una forma clara de implementar los llamados widgets en asp.net mvc. :/ –

+0

Esto no es una limitación de MVC; solicita actualizar solo parte de la página, por lo que debe hacer algo del lado del cliente (por ejemplo, AJAX/JS), ya que TODOS los formularios HTML cambian de página una vez enviados. –

+0

Pregunta simplemente pulse la marca de insignia 'popular'. Sorprendentemente ver cuánto he aprendido. Una pregunta tan estúpida :RE –

0
if(pass != true) 
{ 
ViewData["Message'] = "Hey your login failed!"; Return View("Login") 
} 

En ViewPage

<form action="/tralala/Account/Login" method="post"> 
    <input name="name" />Name<br /> 
    <input name="password" type="password" />Password<br /> 

    <button>Login</button> 
<div style="color: red"><%=ViewData["Message"] %><div> 
</form> 
+1

No entendió el punto. La pregunta fue: cómo actualizar solo 1 formulario, si es posible, no cómo usar el diccionario ViewData. –

+0

Lo siento amigo, sigo leyendo tu pregunta y no entiendo lo que estás preguntando. – Skiltz

+1

Solo estoy preguntando si la página con 2

elementos puede actualizar solo 1 de ellos en ese momento, sin tocar el otro. –

0

Su pregunta no es muy clara.

Pero, por lo que pude entender, la respuesta es muy probable que sí. Puede actualizar cualquier cosa que desee dependiendo de la entrada del usuario.

+0

También no entiendo lo que está preguntando ... ¿puede por favor editar su pregunta para darle un poco más de contexto? Su primera "forma" está mal formada y no tiene ningún elemento de entrada ... ¿Para qué sirve? Pensé que el modeloviewview solo actualiza los campos que intentó enlazar ...? ¿Es eso un widget de inicio de sesión o una página de inicio de sesión? ¿O tiene problemas con los mensajes de validación y el resaltado de validación? Tuve que crear algunas extensiones HTMLHelper personalizadas para manejar múltiples formularios, pero realmente no sé si se aplican aquí porque no puedo entender cuál es tu problema ... algo más de información ayudaría. – Charlino

+0

Lo siento mucho. El inglés no es mi nativo también. Intentaré editar la pregunta. –

1

Si crea un método de controlador que acepte un FormCollection y su vista tiene dos formularios definidos, el formcollection devuelto se rellenará con los valores del formulario A o del formulario B. Puede inspeccionar formCollection y bifurcar su lógica en función del valor en eso. Si quiere que el programa sea muy explícito, podría tener la misma variable oculta en ambos formularios con un valor que le ayudaría a hacer su elección.

Ese es un enfoque. hay algunas formas de lidiar con esto, estoy seguro.

1

Si tiene dos formas simples, se puede utilizar este abordaje:

Se crean dos vistas parciales diferentes.

@model CustomerInfoModel 
@using (Ajax.BeginForm("CustomerInfo", "Customer", new AjaxOptions { HttpMethod = "Post", OnBegin = "InfoLoading", OnComplete = "InfoCompleted" }, new { id = "info", @class = "form-horizontal" })) 
    { 
    <input type="text" class="form-control" name="Name" id="Name" value="@Model.Name" /> 
    <input type="email" class="form-control" name="Email" id="Email" value="@Model.Email" /> 
    <button type="submit" id="save-info" class="btn-medium red">Save</button> 
    } 

y

@model CustomerPasswordChangeModel 
@using (Ajax.BeginForm("CustomerPasswordChange", "Customer", new AjaxOptions { HttpMethod = "Post", OnBegin = "InfoLoading", OnComplete = "InfoCompleted" }, new { id = "change", @class = "form-horizontal" })) 
{ 
<input type="password" class="form-control" name="OldPassword" id="OldPassword" value="" /> 
<input type="password" class="form-control" name="NewPassword" id="NewPassword" value="" /> 
<button type="submit" id="save-change" class="btn-medium red" autocomplete="off">Save</button> 
} 

En su vista padre,

@Html.Partial("CustomerInfo", Model.CustomerInfo) 

y

@Html.Partial("CustomerPasswordChange", Model.CustomerPasswordChange) 

En Controlador:

[HttpPost] 
    public ActionResult CustomerInfo([Bind(Include = "Name,Email")] CustomerInfoModel model) 
    { 
     if (ModelState.IsValid) 
      return new Json(new { success=true, message="Updated.", errors=null); 

// do you logic 

     return new Json(new { success=false, message="", errors=getHtmlContent(ModelState.Values.SelectMany(v => v.Errors).ToList(), "ModelError")); 
    } 

    [HttpPost] 
    public ActionResult CustomerPasswordChange([Bind(Include = "OldPassword,NewPassword")] CustomerPasswordChangeModel model) 
    { 
     if (ModelState.IsValid) 
      return new Json(new { success=true, message="Updated.", errors=null); 

// do you logic 

     return new Json(new { success=false, message="", errors=getHtmlContent(ModelState.Values.SelectMany(v => v.Errors).ToList(), "ModelError")); 
    } 

Esto hará lo que quiera hacer.

Nota: el método getHtmlContent genera un mensaje de error para mostrar en la página. Nada tan especial. Puedo compartirlo si es necesario.

Cuestiones relacionadas