Asp.net mvc 3 asp.net mvc 3客户端验证提交空表单或未正确验证

Asp.net mvc 3 asp.net mvc 3客户端验证提交空表单或未正确验证,asp.net-mvc-3,Asp.net Mvc 3,似乎我的客户端验证没有正确验证 在我的登录屏幕上,当我设置用户名和密码并提交表单时,表单将被清除,并显示必填字段的验证消息,并且表单并不总是过账。为什么验证清除我的字段并说它们是空的 有时表单会过帐,但字段为空,因此服务器上的模型绑定失败 更奇怪的是,我已经禁用了客户端验证,但它仍然在我的生产服务器上失败 戴夫的一切都很好 更新: 我的动作已经分开了,甚至不同的动作名称 [HttpGet] public ActionResult LogOn() {

似乎我的客户端验证没有正确验证

在我的登录屏幕上,当我设置用户名和密码并提交表单时,表单将被清除,并显示必填字段的验证消息,并且表单并不总是过账。为什么验证清除我的字段并说它们是空的

有时表单会过帐,但字段为空,因此服务器上的模型绑定失败

更奇怪的是,我已经禁用了客户端验证,但它仍然在我的生产服务器上失败

戴夫的一切都很好

更新: 我的动作已经分开了,甚至不同的动作名称

[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>
}
试试这个表格

通常,我们会在MVC中将GET操作与POST操作分开:

 [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.beginrequest方法的适当重载函数,其中您提到Html表单正在使用HttpPost表单方法发送请求

您是否有可能在没有模型的情况下往返于服务器,摆出数据姿势,然后返回一个新视图,从而得到一个空白表单?根据我的经验,验证器永远不会删除表单中的任何值,这不是它的工作方式。既然你提到了它,我想它与我的另一篇文章有关:。由于未发布我的表单,因此视图中会重新加载空字段。“我的模型”无效,因为“所有”字段没有从表单/模型活页夹中填充,并且它会用空字段重新加载页面
 @Html.ValidationSummary(false)