Múltiplas formas em ASP.NET MVC
-
03-07-2019 - |
Pergunta
Contexto
Let `s dizer que eu tenho:
Em Site.Master de layout:
<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 parece com:
<form action="/myApp/Account/Login" method="post">
<input name="name" />Name<br />
<input name="password" type="password" />Password<br />
<button>Login</button>
</form>
É possível atualizar apenas o login widget de formulário, e não toda a página de conteúdo?
Solução
Se você está se referindo a um post http, apenas uma pós iniciado (ele também pode ser iniciada por javascript) por um botão de envio de dentro do formulário será enviado para o servidor.
Se os formulários são aninhados então este não vai funcionar. A forma exterior será sempre enviar para o servidor.
No HTML exemplo abaixo, clicando no botão enviar no primeiro formulário não irá enviar os valores a partir do segundo formulário para o servidor. Da mesma forma, clicando no botão segundo submeter a não postar os valores da primeira forma.
<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 você só deseja atualizar / alterar uma das seção forma, então não isso não pode ser feito sem o uso de javascript e realizando um post javascript (aka Ajax ).
Outras dicas
Se você construir um método de controlador que aceita um FormCollection e sua visão tem duas formas definidas, o formcollection retornado irá ser preenchida com valores de forma A ou forma B. Você pode inspecionar o FormCollection e ramo de sua lógica com base no valor lá no. Se você quer a ser muito explícita você poderia ter a mesma variável oculta ocorrem em ambas as formas com um valor que iria ajudar a sua fazer sua escolha.
Essa é uma abordagem. existem algumas maneiras de lidar com isso eu tenho certeza.
Se você tem duas formas simples, você pode usar este aproach:
Você cria duas visões parciais 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>
}
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>
}
Na sua opinião pai,
@Html.Partial("CustomerInfo", Model.CustomerInfo)
e
@Html.Partial("CustomerPasswordChange", Model.CustomerPasswordChange)
Em 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"));
}
Isso vai fazer o que você quer fazer.
Nota: método getHtmlContent é apenas gerar uma mensagem de erro a ser exibido na página. Nada tão especial. Eu possa compartilhá-lo, se necessário.
A sua pergunta não é muito clara.
Mas, tanto quanto eu poderia entender, a resposta é provavelmente sim. Você pode atualizar o que quiser, dependendo da entrada do usuário.
if(pass != true)
{
ViewData["Message'] = "Hey your login failed!"; Return View("Login")
}
Em 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>