远程验证从不在“创建”视图中调用,但在“编辑”视图中会调用
本文关键字:视图 调用 程验证 但在 编辑 验证 创建 | 更新日期: 2023-09-27 18:26:08
我在创建视图中有一个表单,由于某些原因,它没有提交,因此没有调用创建控制器。如果我使用完全相同的视图,但对于Edit控制器,它可以完美地工作,并且Create和Edit控制器方法采用相同的参数,它们具有相同的属性,并且它们具有几乎相同的代码,所以我不知道为什么Create视图中的表单不提交,而Edit视图中的表格提交。我认为这是JQuery客户端验证中的一个错误,但没有显示任何错误。我已经尝试了所有的方法,但我没有主意,我不知道如何调试JQuery Validation插件,看看它在表单的哪个字段出错,以及它是否阻止了表单提交。是什么原因导致表格无法提交?
这是不提交的创建视图:
@model WebContingencia.Models.Contacto
@{
ViewBag.Title = "Crear nuevo";
}
<h2>Crear</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
@using (Html.BeginForm("Create", "Contacto", FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Contacto</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Nombre)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Nombre)
@Html.ValidationMessageFor(model => model.Nombre)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Email)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Email)
@Html.ValidationMessageFor(model => model.Email)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Celular)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Celular)
@Html.ValidationMessageFor(model => model.Celular)
</div> <p>
<input type="submit" value="Crear" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
这个视图的模型:
public class Contacto
{
public int ID { get; set; }
[StringLength(40, ErrorMessage = "Nombre demasiado largo"), Required(ErrorMessage = "Debe ingresar su nombre y apellido")]
[Display(Name="Nombre y apellido")]
public string Nombre { get; set; }
[StringLength(40, ErrorMessage = "E-mail demasiado largo")]
[Display(Name = "E-mail")]
[DataType(DataType.EmailAddress)]
[RegularExpression(@"'b[A-Z0-9._%+-]+@[A-Z0-9.-]+'.[A-Z]{2,4}'b",ErrorMessage="El e-mail no es valido")]
[Remote("ValidarMail", "Contacto", HttpMethod = "Post", AdditionalFields="ID",ErrorMessage = "El e-mail ingresado ya existe")]
public string Email { get; set; }
[StringLength(12, ErrorMessage = "Demasiados digitos"), Required(ErrorMessage = "Debe ingresar su telefono celular")]
[Display(Name = "Telefono celular")]
public string Celular { get; set; }
public virtual ICollection<Record> Records { get; set; }
}
以及创建控制器。这不会被调用。我认为表格甚至没有提交,所以我怀疑问题就在这里:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(
[Bind(Include = "ID,Nombre, Email, Celular")]
Contacto contacto)
{
var record= new Record();
record.ContactoID = contacto.ID;
record.Operacion = "CREAR";
record.Fecha = DateTime.Now;
record.CelCargado = contacto.Celular;
record.EmailCargado = contacto.Email;
contacto.Records=new List<Record>();
contacto.Records.Add(record);
try
{
if (ModelState.IsValid)
{
db.Contactos.Add(contacto);
db.SaveChanges();
return RedirectToAction("Index");
}
else
{
throw new DataException();
}
}
catch (DataException /*dex*/)
{
//Uncomment dex and write here to write to log
ModelState.AddModelError("", "No se pudo guardar los cambios. Por favor intente de nuevo");
}
return View(contacto);
}
您的控制器是否命名为"Contacto"?
Html.BeginForm("Create", "Contacto", FormMethod.Post)
行表示要调用Contacto控制器上的Create方法,因此如果您的控制器的名称与您的型号不同,则需要将其替换为控制器名称。这就是为什么你应该发布你的控制器代码以及Stephen Muecke提到的。
原来我忘了将ValidarMail函数中的id参数设置为可选参数,所以当在没有参数的情况下调用该函数时,它找不到该函数。