Несколько форм в ASP.NET MVC - PullRequest
8 голосов
/ 05 мая 2009

Context
Допустим, у меня есть:
В макете 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>

Частичное представление входа выглядит так:

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

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

Ответы [ 5 ]

15 голосов
/ 05 мая 2009

Если вы ссылаетесь на сообщение 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 (aka Ajax ).

1 голос
/ 15 февраля 2015

Если у вас есть две простые формы, вы можете использовать этот подход:

Вы создаете два разных частичных вида.

@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 просто генерирует сообщение об ошибке, которое будет отображаться на странице. Ничего особенного. Я могу поделиться им, если потребуется.

1 голос
/ 16 марта 2012

Если вы создаете метод контроллера, который принимает FormCollection, и в вашем представлении определены две формы, возвращаемая форма formcollection будет заполнена значениями из формы A или формы B. Вы можете проверить formCollection и выполнить ветвление вашей логики на основе значения в нем. Если вы хотите, чтобы они были очень явными, вы можете иметь одну и ту же скрытую переменную в обеих формах со значением, которое поможет вам сделать ваш выбор.

Это один из подходов. Я уверен, что есть несколько способов справиться с этим.

0 голосов
/ 05 мая 2009

Ваш вопрос не очень понятен.

Но, насколько я мог понять, ответ, скорее всего, да. Вы можете обновить все, что захотите, в зависимости от пользовательского ввода.

0 голосов
/ 05 мая 2009
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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...