Множество форм в ASP.NET MVC
-
03-07-2019 - |
Вопрос
Контекст
Допустим, у меня есть:
В макете сайта.Мастер:
<div class="leftColumn">
<asp:ContentPlaceHolder ID="MainContent" runat="server" />
</div>
<div class="rightColumn">
<% Html.RenderPartial("_Login"); %>
<asp:ContentPlaceHolder ID="SideContent" runat="server" />
</div>
Частичный просмотр входа в систему выглядит следующим образом:
<form action="/myApp/Account/Login" method="post">
<input name="name" />Name<br />
<input name="password" type="password" />Password<br />
<button>Login</button>
</form>
Можно ли обновить только форму виджета входа в систему, а не всю страницу содержимого?
Решение
Если вы ссылаетесь на http-сообщение, на сервер будет отправлено только сообщение, инициированное (оно также может быть инициировано javascript) кнопкой отправки из формы.
Если ваши формы вложены, то это не сработает.Внешняя форма всегда будет отправляться на сервер.
В приведенном ниже примере HTML нажатие на кнопку отправки в первой форме не приведет к отправке значений из второй формы на сервер.Аналогично, нажатие второй кнопки отправки не приведет к отправке значений из первой формы.
<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>
Если вы хотите обновить / изменить только один из разделов формы, то нет, это невозможно сделать без использования javascript и выполнения javascript post (он же Аякс).
Другие советы
Если вы создаете метод контроллера, который принимает FormCollection, и в вашем представлении определены две формы, возвращаемая formcollection будет либо заполнена значениями из формы A, либо из формы B.Вы можете проверить FormCollection и разветвлять свою логику на основе содержащегося в ней значения.Если вы хотите, чтобы это было очень явно, вы могли бы использовать одну и ту же скрытую переменную в обеих формах со значением, которое помогло бы вам сделать свой выбор.
Это один из подходов.я уверен, что есть несколько способов справиться с этим.
Если у вас есть две простые формы, вы можете использовать этот подход:
Вы создаете два разных частичных вида.
@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>
}
и
@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>
}
В вашем родительском представлении,
@Html.Partial("CustomerInfo", Model.CustomerInfo)
и
@Html.Partial("CustomerPasswordChange", Model.CustomerPasswordChange)
В контроллере:
[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"));
}
Это позволит сделать то, что вы хотите сделать.
Примечание:Метод getHtmlContent просто генерирует сообщение об ошибке, которое будет отображаться на странице.Ничего особенного.Я могу поделиться им, если потребуется.
Ваш вопрос не очень ясен.
Но, насколько я смог понять, ответ, скорее всего, положительный.Вы можете обновить все, что захотите, в зависимости от пользовательского ввода.
if(pass != true)
{
ViewData["Message'] = "Hey your login failed!"; Return View("Login")
}
На странице просмотра
<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>