0

我在 ajax.ActionLink 之后遇到了不显眼的验证问题,表单正确提交,当 ajax 替换 div 目标时,不创建客户端验证。

我认为这是:

@using (Ajax.BeginForm("Action", "Controller", new { area = "Area" }, new AjaxOptions { HttpMethod = "post", InsertionMode = InsertionMode.Replace, UpdateTargetId = "divTarget" }))
    {
        //html stuff....
            <li>
                <label><br/></label>
                <div class="perfil_datos_botones">
                    <input type="submit" value="Crear cita" id="enviar">
                    @Ajax.ActionLink("Volver", "Action", "Controller", new { area = "Area" }, new AjaxOptions { HttpMethod = "get", InsertionMode = InsertionMode.Replace, UpdateTargetId = "divTarget", OnComplete = "ValidarForm('target')" }, new { @class = "links_botones" })
                </div>
            </li>
        </ul>
    }

OnComplete 函数:

function ValidarForm(sel) {
        var selector = "#" + new String(sel);
        $.validator.unobtrusive.parse(selector);
    }

我把这个放在视图上:

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>

这在布局中:

@Scripts.Render("~/bundles/jqueryval_noajax")

这个包在没有 ajax.unobtrusive.js 的情况下呈现 jquery-validation 插件,因为这会在视图上生成多个帖子

我曾尝试在 OnSuccess 中使用该函数并且任一工作,验证器都会抛出一个异常,上面写着:“unobtrusive field is undefined”。

我需要在每个使用 ajax.BeginForm 或 ajax.ActionLink 的 partialView 上重新加载客户端验证。

编辑1:

我发现$.validator是这样undefined,我通过 jquery 的 ajax 更改了 ajax.actionLink,但我仍然收到错误

4

1 回答 1

0

我在使用内置 Ajax.BeginForm 时遇到问题,而是直接使用 JQuery。最后发现它要容易得多,原因之一是有大量关于 JQuery 的文档可用,而关于它的 MS 包装器却没有那么多。

所以 fom 只是一个非常经典的 HTML 表单,带有一个简单的按钮:(我删除了所有的输入字段)

<form id="AllCatsForm>
  <table>
    <input type="submit" value="Search" />
  </table>
</form>

然后(首先在脚本标签之间,然后在单独的 .js 文件中)

$("#AllCatsForm").ajaxForm({
    url: "/home/GetAllItems",
    type: "POST",
    beforeSubmit: validateCatSelected,
    success: function (data) {
        $("#ListOfBooksHere").html(data);
    }
});

检查强制输入字段的功能不为空:

function validateCatSelected(formData, jqForm, options) {
    var selectedBooksCategory = $("input[name=CategoryNodeId]").fieldValue();
    if (selectedBooksCategory[0] === "0") {
        alert("Please select a Genre or Category before doing a Custom Search.");
        return false;
    }
    itemLoad = 1;
}

“ListofBookshere”只是一个空的 DIV 标记,用作搜索结果的容器:

<div id="ListOfBooksHere" style="padding: 5px; min-height: 500px;" />

这是控制器中的函数(几乎所有字段都被删除了)注意它确实返回了一个局部视图,但这个视图不在主视图中。它的唯一用途是将返回的数据正确格式化为像样的 html。

[HttpPost]
        public async Task<ActionResult> GetAllItems(GenericSearchViewModel filter)
        {
            vm = filter;            
            search.Condition = (string.IsNullOrEmpty(vm.Condition) != true) ? vm.Condition : "All";         
            vm.CatsResults.CatsListResults = await GetCatsResults(search);                   
            return PartialView("GetAllItems", vm);        
        }

希望这可以帮助。从 MVC 中直接使用 JQuery 并不难,并且给您更大的控制权。我当然不是说内置助手不起作用或有用,我尝试了 JQuery 直接路由,因为我开始感到沮丧,而且它对我来说效果很好。

希望这有帮助,伯纳德

PS-我会忘记的!此代码使用 JQuery 插件 JQuery 表单: http: //malsup.com/jquery/form/

于 2013-09-11T15:01:36.300 回答