ASP.NET MVC 4 验证后自定义 jQuery 脚本无法正常工作

Posted

技术标签:

【中文标题】ASP.NET MVC 4 验证后自定义 jQuery 脚本无法正常工作【英文标题】:Custom jQuery script not working correctly after ASP.NET MVC 4 validation 【发布时间】:2013-05-05 05:32:51 【问题描述】:

我正在使用 jQuery 来启用和禁用两个单独的文本框输入及其标签,基于 Dropbox (#Drop1) 中的选择。这是我的 jQuery 脚本:

$(function () 
    $("#Drop1").change(function () 
        if ($(this).val() == "IWR") 
            ShowOther()
        
        else 
            ShowIWR()
        
    );
);

$(function () 
    $("#Drop1").ready(function () 
        if ($(this).val() == "IWR") 
            ShowOther()
        
        else 
            ShowIWR()
        
    );
);

function ShowOther() 
    $("#Job").attr("disabled", "disabled").css( "background-color": "#999", "display": "none" );
    $("#job_row").css( "display": "none" );
    $("#Project").removeAttr("disabled").css( "background-color": "#EFF8FB", "display": "block" );
    $("#proj_row").css( "display": "block" );


function ShowIWR() 
    $("#Job").removeAttr("disabled").css( "background-color": "#EFF8FB", "display": "block" );
    $("#job_row").css( "display": "block" );
    $("#Project").attr("disabled", "disabled").css( "background-color": "#999", "display": "none" );
    $("#proj_row").css( "display": "none" );

在页面加载时,一切都按预期工作。当我更改 Dropbox 时,正确的文本框及其输入会像我预期的那样显示和隐藏。查看我的代码,您可以看到 ID #Job 和 #job_row 应该是可见的,而 #Project 和 #proj_row 是隐藏的,反之亦然。当页面使用 GET() 加载时,与作业相关的标签和文本框是可见的。

我遇到的问题是在我选择显示#Project 和#proj_row (Drop1.val = "IWR") 的下拉列表后,如果验证器捕获的页面上出现错误,则页面不会重新加载正确起来。 #Job 和 #job_row 是可见的,即使重新加载 Drop1.val 仍然 = 到 "IWR"。

如果有帮助,这是我的控制器代码:

    [HttpPost]
    public ActionResult Create(QCLog qclog)
    
        if (qclog.Job == null)
        
            if (qclog.Type != "IWR")
            
                ModelState.AddModelError("Job", "Job is required unless it is an IWR.");
            
            else
            
                if (qclog.Project == null)
                
                    ModelState.AddModelError("Project", "Project is required for IWRs.");
                
            
        

        if (ModelState.IsValid)
        
            if (qclog.Job != "IWR")
            
                string[] qcjob = qclog.Job.Split('-');
                int temp = Convert.ToInt32(qcjob[0]);
                try
                
                    var job = jobdb.Server5_Job.Single(j => j.Job == temp);
                    qclog.Project = job.ProjectID;
                    qclog.Blend = job.BlendLot;
                
                catch (Exception ex)
                
                    qclog.Project = null;
                    qclog.Blend = null;
                

            
            else
            
                qclog.Project = null;
                qclog.Blend = null;
            
            qclog.Timestamp = DateTime.Now;
            qclog.Status = "Incomplete";
            db.QCLogs.AddObject(qclog);
            db.SaveChanges();
            //PrintLabel(qclog);
            return RedirectToAction("Index");
        
        return View(qclog);
    

这是页面的视图源,经过错误验证:

<tr class="transparent">
                    <td class="transparent"><select id="Drop1" name="Type"><option value="FPI">FPI</option>
<option selected="selected" value="IWR">IWR</option>
<option value="Final">Final</option>
<option value="SMS">SMS</option>
<option value="Incoming">Incoming</option>
<option value="GageRR">Gage R+R</option>
<option value="Other">Other</option>
</select>
                    </td>
                    <td class="transparent"><span class="field-validation-valid" data-valmsg-for="Type" data-valmsg-replace="true"></span>
                    </td>
                </tr>
                <tr class="transparent">
                    <td class="transparent">
                        Operation
                    </td>
                    <td class="transparent">
                    </td>
                </tr>
                <tr class="transparent">
                    <td class="transparent"><input class="text-box single-line" data-val="true" data-val-length="Operation field cannot contain more than 3 characters." data-val-length-max="3" data-val-required="Operation required." id="Operation" name="Operation" type="text" value="020" />
                    </td>
                    <td class="transparent"><span class="field-validation-valid" data-valmsg-for="Operation" data-valmsg-replace="true"></span>
                    </td>
                </tr>
                <tr id="proj_row" class="transparent">
                    <td  class="transparent">
                        Project (ex. 0730A)
                    </td>
                    <td class="transparent">
                    </td>
                </tr>
                <tr class="transparent">
                    <td class="transparent"><input class="input-validation-error text-box single-line" id="Project" name="Project" type="text" value="" />
                    </td>
                    <td class="transparent"><span class="field-validation-error" data-valmsg-for="Project" data-valmsg-replace="true">Project is required for IWRs.</span>
                    </td>
                </tr>
                <tr id="job_row" class="transparent">
                    <td class="transparent">
                        Job Number (ex. 12345-1)
                    </td>
                    <td class="transparent">
                    </td>
                </tr>
                <tr class="transparent">
                    <td class="transparent"><input class="text-box single-line" data-val="true" data-val-length="Job field cannot contain more than 10 characters." data-val-length-max="10" id="Job" name="Job" type="text" value="" />
                    </td>
                    <td class="transparent"><span class="field-validation-valid" data-valmsg-for="Job" data-valmsg-replace="true"></span>
                    </td>
                </tr>

如果我的代码没有达到应有的效率,我提前道歉。我是一名后端人员,仍在了解前端框架。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

我想通了。而不是使用:

$(function () 
    $("#Drop1").ready(function () 
        if ($(this).val() == "IWR") 
            ShowOther()
        
        else 
            ShowIWR()
        
    );
);

我必须使用文档准备功能,如下所示:

$(document).ready(function () 
    if ($("#Drop1").val() == "IWR") 
        ShowOther()
    
    else 
        ShowIWR()
    
);

这样就达到了我想要的效果。我只能假设“#Drop1”的值在控件准备好时没有设置,而是在文档准备好后设置的。

【讨论】:

欢迎来到 SO 并祝贺您解决了自己的问题。从我这边 +1。

以上是关于ASP.NET MVC 4 验证后自定义 jQuery 脚本无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC:通过 DataAnnotation 进行自定义验证

ASP.NET MVC 4 混合认证模式

ASP.NET MVC 4 模型验证

ASP.Net Core MVC - 自定义验证

ASP.NET MVC5 自定义身份验证

ASP .Net MVC 3:自定义不显眼的验证