描述:
我在一个 MVC4 应用程序中有一个简单的表单,它有 5 个名为 loc1-5 的文本框和一个提交按钮。该应用程序在文本框 loc1-5 中最多占用 5 个地址,并使用带有 jQuery 的 bing 地理编码服务对地址进行一些处理并创建带有方向的地图。
问题是我需要验证 loc1-5 文本框以确保它们是有效地址,然后再继续并决定最有意义的方法是使用 jQuery.validate 远程调用可以使用我的 MVC 控制器函数用于检查有效地址的预构建函数。
现在我确实想出了一个可行的解决方案来验证这些字段,但我迫切需要使它更加动态,以便将来可以以最小的努力添加更多的文本框。理想情况下,我希望逻辑能够对所有以“loc”开头的输入进行验证。
工作解决方案(非常脏):
简单形式(在 MVC 视图中)
<form action="/Home/ViewResult" method="post" id="ViewResult" name="ViewResult">
<fieldset>
<legend>Enter Route</legend>
<p>
Address 1 (Start & End):
</p>
<p>
<input type="text" id="loc1" name="loc1" value='' />
</p>
<p>
Address 2:
</p>
<p>
<input type="text" id="loc2" name="loc2" value='' />
</p>
<p>
Address 3:
</p>
<p>
<input type="text" id="loc3" name="loc3" value='' />
</p>
<p>
Address 4:
</p>
<p>
<input type="text" id="loc4" name="loc4" value='' />
</p>
<p>
Address 5:
</p>
<p>
<input type="text" id="loc5" name="loc5" value='' />
</p>
<p>
<input type="submit" value="Route"/>
</p>
</fieldset>
</form>
jQuery 验证代码(在 MVC 视图中)
<script src="../../Scripts/jquery.validate.js" type="text/javascript"></script>
<script type="text/javascript">
$(文档).ready(函数 () { $("#ViewResult").validate({ onfocusout:错误, onkeyup:假, 规则:{ “loc1”:{ 要求:真, 偏僻的: { url: "/Home/IsValidAddress1", 超时:2000, 类型:“帖子” } }, “loc2”:{ 要求:真, 偏僻的: { url: "/Home/IsValidAddress2", 超时:2000, 类型:“帖子” } }, “loc3”:{ 要求:真, 偏僻的: { url: "/Home/IsValidAddress3", 超时:2000, 类型:“帖子” } }, “loc4”:{ 偏僻的: { url: "/Home/IsValidAddress4", 超时:2000, 类型:“帖子” } }, “loc5”:{ 偏僻的: { url: "/Home/IsValidAddress5", 超时:2000, 类型:“帖子” } } }, 消息:{ “loc1”:{ required: "开始/结束位置是必填字段。", 远程:“请输入一个有效的地址。” }, “loc2”:{ required: "请输入至少 3 个地址。", 远程:“请输入一个有效的地址。” }, “loc3”:{ required: "请输入至少 3 个地址。", 远程:“请输入一个有效的地址。” }, “loc4”:{ 远程:“请输入一个有效的地址。” }, “loc5”:{ 远程:“请输入一个有效的地址。” }, } }); });
</script>
远程引用的 Home Controller 中的函数
// 检查有效地址的函数 公共布尔 IsValidAddress(字符串位置) { // 如果不为空 如果(位置!=“”) { // 尝试获取航路点 航点航点 = getWaypoint(location); // 如果没有返回航点,则返回 false 如果(航点==空) { 返回假; } } 返回真; } public JsonResult isValidAddress1(string loc1) // 参数必须是文本框名称 { 如果(!IsValidAddress(loc1)) { 返回新的 JsonResult { 数据 = false }; } 返回新的 JsonResult { 数据 = true }; } public JsonResult isValidAddress2(string loc2) // 参数必须是文本框名称 { 如果(!IsValidAddress(loc2)) { 返回新的 JsonResult { 数据 = false }; } 返回新的 JsonResult { 数据 = true }; } public JsonResult isValidAddress3(string loc3) // 参数必须是文本框名称 { 如果(!IsValidAddress(loc3)) { 返回新的 JsonResult { 数据 = false }; } 返回新的 JsonResult { 数据 = true }; } public JsonResult isValidAddress4(string loc4) // 参数必须是文本框名称 { 如果(!IsValidAddress(loc4)) { 返回新的 JsonResult { 数据 = false }; } 返回新的 JsonResult { 数据 = true }; } public JsonResult isValidAddress5(string loc5) // 参数必须是文本框名称 { 如果(!IsValidAddress(loc5)) { 返回新的 JsonResult { 数据 = false }; } 返回新的 JsonResult { 数据 = true }; }
问题:
这同样有效,但它很脏而且根本不是动态的。
基本上我有两个问题。
- 如何编写 jQuery 速记来为所有以“loc”开头的文本框创建验证规则?
- 据我所知,处理远程调用的 MVC 控制器函数必须将文本框的名称传递给它。那么如何让一个 MVC 控制器函数处理对它的多个远程调用呢?
我在 jQuery 方面不是很强大,但我真正想要的是这样的东西,所以我可以稍后以最小的努力添加更多的文本框:
<script src="../../Scripts/jquery.validate.js" type="text/javascript"></script>
<script type="text/javascript">
$(文档).ready(函数 () { $("#ViewResult").validate({ onfocusout:错误, onkeyup:假, 规则:{ “loc1”:{ 要求:真, }, “loc2”:{ 要求:真, }, “loc3”:{ 要求:真, }, $("input=text").StartsWith("loc").each(): { 偏僻的: { url: "/Home/IsValidAddress", 超时:2000, 类型:“帖子” } } }, 消息:{ “loc1”:{ required: "开始/结束位置是必填字段。", }, “loc2”:{ required: "请输入至少 3 个地址。", }, “loc3”:{ required: "请输入至少 3 个地址。", }, $("input=text").StartsWith("loc").each(): { 远程:“请输入一个有效的地址。” }, } }); });
</script>
和家庭控制器功能
// 检查有效地址的函数 public JsonResult IsValidAddress(string loc) // loc 变量连接到动态文本框名称? { // 如果不为空 如果 (loc != "") { // 尝试获取航路点 航点航点 = getWaypoint(loc); // 如果没有返回航点,则返回 false 如果(航点==空) { 返回新的 JsonResult { 数据 = false }; } } 返回新的 JsonResult { 数据 = true }; }
最后请注意,我没有能力更改 MVC 模型。我见过很多与此类似的解决方案,它们直接在 MVC 模型中编写验证规则和远程调用,但我根本无法那样做。
欢迎任何改进建议,并提前感谢您的任何回复。
请尝试告诉我我哪里出错了,或者我想要的是否可能。