Domanda

Contesto
Diciamo che ho:
Nel layout 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>

Login partialView simile a:

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

È possibile aggiornare solo il modulo del widget di accesso, non l'intera pagina del contenuto?

È stato utile?

Soluzione

Se ti riferisci a un post http, solo un post avviato (può anche essere avviato da javascript) tramite un pulsante di invio all'interno del modulo verrà pubblicato sul server.

Se i moduli sono nidificati, questo non funzionerà. Il modulo esterno verrà sempre pubblicato sul server.

Nell'esempio HTML di seguito, facendo clic sul pulsante Invia sul primo modulo non verranno inviati al server i valori del secondo modulo. Allo stesso modo, facendo clic sul secondo pulsante di invio non verranno pubblicati i valori dal primo modulo.

<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>

Se desideri aggiornare / modificare solo una sezione del modulo, non puoi farlo senza usare javascript ed eseguire un post javascript (aka Ajax ).

Altri suggerimenti

Se si crea un metodo controller che accetta un FormCollection e la vista ha due moduli definiti, il formcollection restituito verrà popolato con i valori dal modulo A o dal modulo B. È possibile ispezionare formCollection e ramificare la logica in base al valore in essa. Se vuoi essere molto esplicito, potresti avere la stessa variabile nascosta in entrambe le forme con un valore che ti aiuterebbe a fare la tua scelta.

Questo è un approccio. ci sono alcuni modi per affrontarlo, ne sono sicuro.

Se hai due semplici moduli, puoi usare questo approccio:

Si creano due diverse viste parziali.

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

e

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

Nella vista padre,

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

e

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

Nel controller:

    [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"));
    }

Questo farà quello che vuoi fare.

Nota: il metodo getHtmlContent sta semplicemente generando un messaggio di errore da visualizzare sulla pagina. Niente di così speciale. Posso condividerlo se richiesto.

La tua domanda non è molto chiara.

Ma per quanto ho potuto capire, la risposta è molto probabilmente sì. Puoi aggiornare tutto ciò che desideri a seconda dell'input dell'utente.

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

Su 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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top