【问题标题】:Remote validation never gets called in Create view but it does in Edit view在创建视图中永远不会调用远程验证,但在编辑视图中会调用
【发布时间】:2014-10-09 20:41:37
【问题描述】:

我在 Create View 中有一个表单,由于某种原因它没有提交,因此没有调用 Create 控制器。如果我使用完全相同的视图,但对于 Edit 控制器,它可以完美运行,并且 Create 和 Edit 控制器方法都采用相同的参数,并且它们具有相同的属性并且它们具有几乎相同的代码,所以我不知道为什么 Create 中的表单视图不提交,但编辑视图中的表单提交。我认为这是 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);
        }

【问题讨论】:

  • 请同时发布您的模型和控制器方法
  • 我找到了罪魁祸首:模型中的远程验证器。如果我删除它一切正常。但我真的需要远程验证,并且由于某种原因,添加它似乎会破坏所有 jQuery 客户端验证。当我添加远程验证器时,大多数对 jquery 验证插件的调用什么都不做。
  • 事实证明,远程验证永远不会在创建视图上调用,但它会在编辑视图上调用。奇怪...
  • @Magnus 你叫什么“远程验证”? JQuery客户端验证?还是发帖后在控制器服务器端发生的模型验证?
  • @Magnus 作为测试,暂时删除AdditionalFields="ID" 并查看它是否符合您的远程验证。由于创建表单没有 ID 隐藏字段,我怀疑这是问题所在。您可以为 ID 添加一个隐藏字段,并在您的远程验证处理程序中将其设为可为空的字段,您可以确定验证调用是否来自“创建”页面。

标签: c# jquery asp.net-mvc-3 form-submit remote-validation


【解决方案1】:

您的控制器是否命名为“Contacto”?

Html.BeginForm("Create", "Contacto", FormMethod.Post) 行表示调用 Contacto 控制器上的 Create 方法,因此如果您的控制器名称与模型名称不同,则需要将其替换为控制器名称。这就是为什么您应该发布您的控制器代码以及 Stephen Muecke 提到的原因。

【讨论】:

  • 是的,这个类是 ContactoController。
【解决方案2】:

原来我忘记在 ValidarMail 函数中设置 id 参数是可选的,所以在没有参数的情况下调用该函数时找不到该函数。

天啊!

【讨论】:

    猜你喜欢
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多