Pregunta

Contexto
Digamos que tengo:
En diseño Site.Master:

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

El inicio de sesión de vista parcial se ve así:

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

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

¿Fue útil?

Solución

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

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

En el HTML de muestra 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 solo desea actualizar / cambiar una de las secciones del formulario, entonces no puede hacer esto sin usar javascript y realizar una publicación de javascript (también conocida como Ajax ).

Otros consejos

Si crea un método de controlador que acepta un FormCollection y su vista tiene dos formularios definidos, el formulario devuelto se rellenará con los valores del formulario A o el formulario B. Puede inspeccionar el formulario y recolectar su lógica según el valor en esto. Si desea que sea muy explícito, podría tener la misma variable oculta en ambas formas con un valor que le ayudaría a hacer su elección.

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

Si tiene dos formularios simples, puede utilizar este enfoque:

Creas 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 tu vista principal,

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

y

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

En el 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 quieras hacer.

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

Su pregunta no es muy clara.

Pero por lo que pude entender, la respuesta es muy probable que sí. Puede actualizar lo que desee en función de la entrada del usuario.

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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top