Question

Contexte
Disons que j'ai:
Dans la mise en page 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 ressemble à:

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

Est-il possible de mettre à jour uniquement le formulaire du widget de connexion, pas la page de contenu dans son intégralité?

Était-ce utile?

La solution

Si vous vous référez à une publication http, seule une publication initiée (elle peut également être déclenchée par javascript) par un bouton d'envoi à partir du formulaire sera publiée sur le serveur.

Si vos formulaires sont imbriqués, cela ne fonctionnera pas. Le formulaire externe sera toujours publié sur le serveur.

Dans l'exemple HTML ci-dessous, un clic sur le bouton d'envoi du premier formulaire n'enverra pas les valeurs du deuxième formulaire au serveur. De même, un clic sur le deuxième bouton d'envoi ne publiera pas les valeurs du premier formulaire.

<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 vous souhaitez uniquement mettre à jour / modifier l'une des sections du formulaire, alors cela ne peut pas être fait sans utiliser javascript et effectuer un post javascript (alias Ajax ).

Autres conseils

Si vous créez une méthode de contrôleur acceptant un FormCollection et que votre vue comporte deux formulaires définis, le formulaire retourné sera rempli avec les valeurs du formulaire A ou du formulaire B. Vous pouvez inspecter le formulaireCollection et relier votre logique en fonction de la valeur la bride. Si vous voulez être très explicite, vous pourriez avoir la même variable cachée dans les deux formulaires avec une valeur qui vous aiderait à faire votre choix.

C'est une approche. il y a plusieurs façons de régler ce problème, j'en suis sûr.

Si vous avez deux formulaires simples, vous pouvez utiliser cette approche:

Vous créez deux vues partielles différentes.

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

et

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

Dans votre vue parent,

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

et

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

Dans le contrôleur:

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

Cela fera ce que vous voulez faire.

Remarque: la méthode getHtmlContent ne fait que générer un message d'erreur à afficher sur la page. Rien de si spécial. Je peux le partager si nécessaire.

Votre question n'est pas très claire.

Mais pour autant que je puisse comprendre, la réponse est très probablement oui. Vous pouvez mettre à jour tout ce que vous voulez en fonction de la saisie de l'utilisateur.

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

Sur 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top