Проверка клиента asp.net MVC 3 отправляет пустую форму или не проверяется должным образом - PullRequest
0 голосов
/ 08 декабря 2011

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

На моем экране входа в систему, когда я устанавливаю свое имя пользователя и пароль и отправляю, форма очищается, и появляется сообщение проверки для обязательных полей, и форма не всегда отправляется. почему проверка очищает мои поля и говорит, что они пусты?

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

еще более странно то, что я отключил проверку на стороне клиента, но на моем производственном сервере все равно не получается

В dev все нормально

Обновление: мои действия уже отделены, даже разные имена действий

[HttpGet]
        public ActionResult LogOn()
        {
            LogOnModel model = new LogOnModel() { UserName = "", Password = "" };
            return View(model);
            //return View();
        }

  [HttpPost]
  public ActionResult LogIn(LogOnModel model, FormCollection fcol/*, string returnUrl*/)
        {
            //Request.Form.Count
            StringBuilder sb = new StringBuilder();
            sb.Append("<br/>Form collection: ");
            if (Request.Form.Count > 0)
            {

                NameValueCollection form = Request.Form;
                sb.Append("<Form collection>");
                for (int i = 0; i < fcol.Count; i++)
                    sb.AppendFormat("{0}:{1},", fcol.AllKeys[i].ToString(), fcol[i].ToString());
                sb.Append("</Form collection>");
            }
            sb.Append("<br/>Form : ");
            if (Request.Form.Count > 0)
            {
                NameValueCollection form = Request.Form;
                sb.Append("<form>");
                for (int i = 0; i < form.Count; i++)
                    sb.AppendFormat("{0}:{1},", form.AllKeys[i].ToString(), form[i].ToString());
                sb.Append("</form>");
            }
            sb.Append("<br/>QueryString : ");
            if (Request.Form.Count > 0)
            {
                NameValueCollection form = Request.QueryString;
                sb.Append("<QueryString>");
                for (int i = 0; i < form.Count; i++)
                    sb.AppendFormat("{0}:{1},", form.AllKeys[i].ToString(), form[i].ToString());
                sb.Append("</QueryString>");
            }
            if (model != null)
            {
                sb.Append("<br/>Profile(ProfileModel m) : ");
                sb.AppendFormat("m.username = {0}, m.password = {1}", model.UserName, model.Password);
            }
            if (!ModelState.IsValid)
            {
                sb.Append("<br/>Model errors :");
                var errors = from key in ModelState
                             let errorList = ModelState[key.Key].Errors
                             where errorList.Any()
                             select new
                             {
                                 Item = key.Key,
                                 Value = key.Value,
                                 errorList
                             };

                foreach (var errorList in errors)
                {
                    sb.AppendFormat(@"<br/>MODEL ERROR: [{0}] value:'{1}' ", errorList.Item, errorList.Value);
                    foreach (var error in errorList.errorList)
                    {
                        sb.AppendFormat(" ERROR message: [{0}] exception : '{1}'", error.ErrorMessage, error.Exception);
                    }
                }
            }
            Response.Write(sb);
            //return new ContentResult();
            if (model != null)
                Log(new Exception(string.Format("model username : {0}, password : {1}, request[username] {2} , request[password] : {3}", model.UserName, model.Password, Request["UserName"], Request["Password"])));
            try
            {
                if (ModelState.IsValid)
                {
                    Log(new Exception(string.Format("ModelState {0}", ModelState.IsValid)));
                    Log(new Exception(string.Format("credentials {0},{1}", model.UserName, model.Password)));
                    if (MembershipService.ValidateUser(model.UserName, model.Password))
                    {
                        Log(new Exception(string.Format("MembershipService.ValidateUser {0},{1}", model.UserName, model.Password)));

                        FormsService.SignIn(model.UserName, false/* model.RememberMe*/);
                        Log(new Exception(string.Format("FormsService.SignIn {0},{1}", model.UserName, model.Password)));

                        //if (Url.IsLocalUrl(returnUrl))
                        //    return Redirect(returnUrl);
                        //else
                        return RedirectToAction("Index", "Home");
                    }
                    else
                        ModelState.AddModelError("", "The user name or password provided is incorrect.");
                }
            }
            catch (Exception ex)
            {
                Elmah.SqlErrorLog.GetDefault(System.Web.HttpContext.Current).Log(new Elmah.Error(ex, System.Web.HttpContext.Current));
            }
            // If we got this far, something failed, redisplay form
            return View("LogOn", model);
        }

и да, на моей странице бритвы есть сводка проверки

@Html.ValidationSummary(false, @LocalDealsResources.Strings.LogOnUnsuccessful)
@using (Html.BeginForm("LogIn", "Account"))
{
    <div>
        <fieldset>
            <legend>Account Information</legend>
            <div class="editor-label">
                @Html.LabelFor(m => m.UserName)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.UserName, new { style = " width:200px" })
                @Html.ValidationMessageFor(m => m.UserName)
            </div>
            <div class="editor-label">
                @Html.LabelFor(m => m.Password)
            </div>
            <div class="editor-field">
                @Html.PasswordFor(m => m.Password, new { style = " width:200px" })
                @Html.ValidationMessageFor(m => m.Password)
            </div>
            <p>
                <input type="submit" value="@LocalDealsResources.Strings.LogOn" />
            </p>
        </fieldset>
    </div>
}

попробуй форму http://dealze.com.sapin.arvixe.com/Account/Logon

Ответы [ 3 ]

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

Я наконец-то нашел причину этого

В моем application_beginrequest я регистрирую информацию в другом потоке, думаю, приложение продолжало работать в этом потоке и не смог найти запрос в контексте

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

Вам необходимо использовать надлежащую перегруженную функцию метода Html.Beginform, где вы упоминаете, что Html Form отправляет запрос с использованием метода HttpPost Form. http://msdn.microsoft.com/en-us/library/dd460344.aspx

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

Как правило, мы отделяем наши действия GET от наших действий POST в MVC:

 [HttpGet]
 public ActionResult Index()
 {
      return View();
 }

 [HttpPost]
 public ActionResult Index(ViewModels.SubscriptionModel model)
 {
      if(!ModelState.IsValid)
      {
           return View(model);
      }
      else
      {
           // Code here to save to the database or something else
           return View("saved"); //Return a view that is designed to show a message
      }
 }

Обратите внимание на сообщение, которое мы проверяем, чтобы убедиться, что ModelState был действителен, и если это не так, мы возвращаем их назад к тому же представлению с данными, которые они представили? А если модель действительна, мы что-то делаем, а затем возвращаем другое представление?

Я бы предложил, чтобы для отладки вы также вывели сводку проверки:

 <%: Html.ValidationSummary(false) %>

или для бритвы

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