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)