Несколько форм в ASP.NET в MVC

контекст
Допустим, у меня есть:
В макете сайта.Мастер:

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

войти partialView выглядит так:

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

можно ли обновить только форму виджета входа в систему, а не всю страницу содержимого?

5 ответов


Если вы ссылаетесь на HTTP-сообщение, на сервер будет отправлено только сообщение, инициированное (оно также может быть инициировано javascript) кнопкой отправки из формы.

Если ваши формы вложены, то это не будет работать. Внешняя форма всегда будет post на сервере.

в Примере 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 (aka Ajax).


Если вы создаете метод контроллера, который принимает 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") 
}

На Файлы 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>