Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 远程验证从未在“创建”视图中调用,但在“编辑”视图中调用_C#_Jquery_Asp.net Mvc 3_Form Submit_Remote Validation - Fatal编程技术网

C# 远程验证从未在“创建”视图中调用,但在“编辑”视图中调用

C# 远程验证从未在“创建”视图中调用,但在“编辑”视图中调用,c#,jquery,asp.net-mvc-3,form-submit,remote-validation,C#,Jquery,Asp.net Mvc 3,Form Submit,Remote Validation,我在Create视图中有一个表单,由于某种原因它没有提交,因此没有调用Create控制器。如果我使用完全相同的视图,但对于编辑控制器,它工作得很好,并且创建和编辑控制器方法都采用相同的参数,它们具有相同的属性,并且它们的代码几乎相同,因此我不知道为什么创建视图中的表单不提交,但编辑视图中的表单提交。我认为这是JQuery客户端验证中的一个错误,但没有显示任何错误。 我已经尝试了所有的方法,但是我没有主意,我不知道如何调试JQuery验证插件,看看它在表单的哪个字段出错,以及它是否阻止表单提交。什

我在Create视图中有一个表单,由于某种原因它没有提交,因此没有调用Create控制器。如果我使用完全相同的视图,但对于编辑控制器,它工作得很好,并且创建和编辑控制器方法都采用相同的参数,它们具有相同的属性,并且它们的代码几乎相同,因此我不知道为什么创建视图中的表单不提交,但编辑视图中的表单提交。我认为这是JQuery客户端验证中的一个错误,但没有显示任何错误。 我已经尝试了所有的方法,但是我没有主意,我不知道如何调试JQuery验证插件,看看它在表单的哪个字段出错,以及它是否阻止表单提交。什么会使表格无法提交

这是不提交的创建视图:

@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>
@model WebContingencia.Models.Contacto
@{
ViewBag.Title=“Crear nuevo”;
}
克雷尔
@使用(Html.BeginForm(“Create”、“Contacto”、FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
联系人
@LabelFor(model=>model.Nombre)
@EditorFor(model=>model.Nombre)
@Html.ValidationMessageFor(model=>model.Nombre)
@LabelFor(model=>model.Email)
@EditorFor(model=>model.Email)
@Html.ValidationMessageFor(model=>model.Email)
@LabelFor(model=>model.Celular)
@EditorFor(model=>model.Celular)
@Html.ValidationMessageFor(model=>model.Celular)

} @ActionLink(“返回列表”、“索引”)
以及此视图的模型:

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; }
    }
公共类联系人
{
公共int ID{get;set;}
[StringLength(40,ErrorMessage=“Nombre demasiado largo”),必需(ErrorMessage=“Debe Ingrear su Nombre y apellido”)]
[显示(Name=“Nombre y apellido”)]
公共字符串Nombre{get;set;}
[StringLength(40,ErrorMessage=“电子邮件demasiado largo”)]
[显示(Name=“电子邮件”)]
[数据类型(数据类型.电子邮件地址)]
[RegularExpression(@“\b[A-Z0-9.\UZ0%+-]+@[A-Z0-9.-]+\[A-Z]{2,4}\b”,ErrorMessage=“El电子邮件无有效性”)]
[远程(“ValidarMail”、“Contacto”、HttpMethod=“Post”、AdditionalFields=“ID”、ErrorMessage=“El e-mail Ingreado ya existe”)]
公共字符串电子邮件{get;set;}
[StringLength(12,ErrorMessage=“Demasiados digitos”),必需(ErrorMessage=“Debe Ingrear su telefono celular”)]
[显示(Name=“Telefono celular”)]
公共字符串Celular{get;set;}
公共虚拟ICollection记录{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);
        }
[HttpPost]
[ValidateAntiForgeryToken]
公共行动结果创建(
[Bind(Include=“ID,Nombre,Email,Celular”)]
联系人(Contacto Contacto)
{
var记录=新记录();
record.ContactoID=contacto.ID;
record.Operacion=“CREAR”;
record.Fecha=DateTime.Now;
record.CelCargado=contacto.Celular;
record.EmailCargado=contacto.Email;
contacto.Records=新列表();
联系人记录添加(记录);
尝试
{
if(ModelState.IsValid)
{
db.Contactos.Add(contacto);
db.SaveChanges();
返回操作(“索引”);
}
其他的
{
抛出新的DataException();
}
}
捕获(DataException/*dex*/)
{
//取消对dex的注释并在此处写入以写入日志
ModelState.AddModelError(“,”不在坎比奥斯岛东南部,不在新意);
}
返回视图(contacto);
}
您的控制器名为“Contacto”吗


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

结果是我忘了将ValidarMail函数中的id参数设置为可选的,因此在没有参数的情况下调用函数时,无法找到该函数


哦!请同时发布您的模型和控制器方法。我发现了罪魁祸首:模型中的远程验证器。如果我移除它,一切都会正常。但我真的需要远程验证,出于某种原因,添加它似乎会破坏所有jQuery客户端验证。当我添加远程验证程序时,大多数对jquery验证插件的调用都不起任何作用。结果表明,远程验证从未在创建视图上被调用,但在编辑视图上被调用。奇怪…@Magnus你叫什么“远程验证”?JQuery客户端验证?或者在发布?@Magnus后在控制器服务器端发生的模型验证,作为测试,暂时删除
AdditionalFields=“ID”
,查看它是否命中远程验证。由于create表单没有ID隐藏字段,我怀疑这就是问题所在。您可以为ID添加一个隐藏字段,并在远程验证处理程序中将该字段设置为可为空的字段,您可以确定验证调用是否来自创建页面。是的,该类是ContactoController。