Проверка запуска для обоих элементов управления - PullRequest
0 голосов
/ 09 декабря 2011

В настоящее время у меня есть два частичных представления на одной странице, добавленные с помощью:

@Html.Action("_LogonBox","Account")
@Html.Action("_TrackingBox","Tracking")

у каждого есть своя форма и модель ...

, но если я введу значения в _logonboxпросмотрите и отправьте его, это вызывает проверку на TrackingBox, и, поскольку значения в поле отслеживания пусты, он выделяет текстовые поля как ошибки.

Как мне разобраться, в веб-формах это просто validationGroups?

РЕДАКТИРОВАТЬ

вот разметка:

Просмотр входа в систему

  @model Models.LogonModel
@using (Html.BeginForm("Login", "account", FormMethod.Post, new { Id = "Login" }))
    {
    <div class="boxwrapper">
        <div class="loginbox">
            <a href="#" style="float: right; color: #fff; font-size: 95%%; padding: 5px 10px;">Forgotten
                Password?</a>
            <h3>
                My Account</h3>
            <div class="content">
                <fieldset class="logincontrols">
                    <table>
                        <tr>
                            <td class="loginlabel">
                                 @Html.LabelFor(m => m.UserName)
                            </td>
                            <td class="logintextbox">
                                @Html.TextBoxFor(m => m.UserName, new { ValidationGroup = "Account" })
                            </td>
                        </tr>
                        <tr>
                            <td class="loginlabel">
                                @Html.LabelFor(m => m.Password)
                            </td>
                            <td class="logintextbox">
                                @Html.PasswordFor(m => m.Password, new { ValidationGroup = "Account" })&nbsp;
                                <input type="image" value="Sign In" src="/Content/Images/buttons/signin.png" style="vertical-align: bottom;" ValidationGroup="Account" />
                            </td>
                        </tr>
                    </table>
                </fieldset>
            </div>
        </div>
    </div>}

ОтслеживаниеПросмотр

@model .Models.TrackingModel

@using (Html.BeginForm("Index", "Tracking", new { Id = "Tracking" }))
{
<div class="boxwrapper">
    <div class="bluebox">
        <fieldset class="logincontrols">
        <h3>
            Shipment Tracking</h3>
        <div class="content">
            <p style="text-align: left;">
                &nbsp; &nbsp;Please enter your reference number:</p>
                 @Html.TextBoxFor(m => m.TrackingNumber)
            <br />
            <p style="text-align: right; margin-top: 10px;">
                <input type="image" value="Track Shipment" src="/Content/Images/buttons/trackingbutton.png" />&nbsp;&nbsp;</p>
        </div>
        <fieldset>
    </div>
</div>
}

Далее EDIT добавлены контроллеры по запросу

     public class TrackingController : Controller
        {
            //
            // GET: /Tracking/

            public ActionResult Index()
            {
                return View();
            }

            [HttpPost]
            public ActionResult Index(TrackingModel model)
            {
                return View(model);
            }

            [HttpPost]
            public PartialViewResult _TrackingBox(TrackingModel model)
            {
                return PartialView(model);
            }

            public PartialViewResult _TrackingBox()
            {
                return PartialView();
            }
        }


public class AccountController : Controller
    {
        public ActionResult Login()
        {

            return View();
        }

        [HttpPost]
        public ActionResult Login(LogOnModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (Membership.ValidateUser(model.UserName, model.Password))
                {
                    FormsAuthentication.SetAuthCookie(model.UserName, false);
                    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                        && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    ModelState.AddModelError("", "The user name or password provided is incorrect.");
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

        public PartialViewResult _Logonbox()
        {
            return PartialView();
        }

        [HttpPost]
        public PartialViewResult _Logonbox(LogOnModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                //do something here
            }

            // If we got this far, something failed, redisplay form
            return PartialView(model);
        }

    }

Ответы [ 3 ]

1 голос
/ 15 декабря 2011

Мне удалось это исправить, но если кто-то может прокомментировать, ПОЧЕМУ это исправит, это было бы замечательно.

Я изменил @Html.Action("_partialViewName") на @Html.Partial("_partialViewName"), и это вызвало те же проблемы.

Чтобы исправить это, я должен был включить новый объект модели, как показано ниже.

@Html.Partial("_LogonBox", new TGEFreight.UI.Web.Models.LogOnModel())
@Html.Partial("_TrackingBox", new TGEFreight.UI.Web.Models.TrackingModel())

Что касается того, почему это работает, я не знаю, это, вероятно, из-за моего младенчества с MVC, ноОтвет в любом случае.

Спасибо за помощь, ребята.

0 голосов
/ 15 декабря 2011

Я согласен с @olivehour, вы должны попробовать использовать @ Html.Partial вместо @ Html.Action. Теперь, когда вы говорите, что если вы используете Partial, то вы не можете определить действие, которое они будут использовать, что именно вы имеете в виду. Вы должны быть в состоянии определить действия HttpGet и HttpPost без проблем для каждой из частичных функций, поэтому, например, в качестве примера вы должны быть в состоянии легко сделать следующее:

 public class AccountController : Controller
 {
      ...
      [HttpGet]
      public ActionResult Login()
      {
           return PartialView();
      }

      [HttpPost]
      public ActionResult Login(LoginModel model)
      {
          ... Validate Model & additional logic
          // return some redirect action
      }
 }

Я заметил, что в своем посте вы просто возвращаете PartialView снова, это был просто псевдокод? Если нет, по крайней мере для частичного входа в систему, я бы предположил, что, если кто-то войдет в систему, действие post перенаправит их на другую страницу. В любом случае вы бы отобразили частичное представление, используя @ Html.Partial или @ {Html.RenderPartial (...);} в своем вызывающем представлении. Надеюсь, это поможет.

0 голосов
/ 09 декабря 2011

Я предполагаю, что оба этих набора полей заключены в один и тот же <form>. Вы можете обойти это, имея отдельный <form> для каждого частичного / дочернего действия.

В отличие от веб-форм, MVC позволяет в полной мере использовать HTML, что означает, что вы можете иметь более одной формы на странице. В веб-формах все должно быть на одной странице, чтобы представление могло сохраняться для всей страницы во время каждой обратной передачи.

Если вы используете ненавязчивую проверку jquery, проверки запускаются только для отправленной формы.

Редактировать

Извините, я перечитал ваш вопрос, и вы говорите, что каждый из них имеет свою форму. Можете ли вы показать больше разметки бритвы? Как выглядит ваша кнопка отправки? Есть ли какие-либо jquery или javascript поведения, связанные с формами? Проверка запускается на клиенте или сервере?

Обновление

Вы пытались использовать @ Html.Partial вместо @ Html.Action? Html.Action приводит к новому HTTP-запросу к дочернему методу действия. Какой вид возвращает ваше действие при входе в систему на контроллере учетной записи? Может случиться так, что вход в систему POST вызывает действие отслеживания как POST и вызывает его проверку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...