Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ajax.BeginForm not working with Html.ValidationSummary

I am trying to use the Ajax.BeginForm to post data to a controller. In the case of specific errors, the form should re-render and display the custom error message that was added to the ModelState. For some reason, the error message is not displaying. I am even trying the following test case which is not working, am I missing something?

Edit.cshtml:
@using (Ajax.BeginForm("Edit", "UserInformation", FormMethod.Post, new AjaxOptions { HttpMethod = "Post", InsertionMode = InsertionMode.Replace, UpdateTargetId = "divFormContainerMain", LoadingElementId = "divPreLoader", OnSuccess = "onSuccess" }))
{
    <div id="divPreLoader" style="display:none; text-align: center"><img src="@Url.Content("~/Content/images/preLoader.gif")" alt="" /></div>
    <div id="divFormContainerMain">
        @Html.Partial("_EditPartialView", Model)
    </div>
    <div class="buttonContainerBottom">
        <span class="buttonContainerInner">
            <input type="submit" id="btnSave" name="buttonPress" value="save" class="orangeButton" />
        </span>
    </div>
}


_EditPartialView.cshtml:
@Html.ValidationSummary(false)
<div id="divFormContainerUserInformation" class="formContainer">
    <div class="labelContainer">
        @Html.LabelFor(m => m.UserName)
    </div>
    <div class="elementContainer">
        @Html.TextBoxFor(m => m.UserName, new { style = "width: 200px" })
        @Html.ValidationMessageFor(m => m.UserName)
    </div>
    <div class="labelContainer">
        @Html.LabelFor(m => m.Name)
    </div>
    <div class="elementContainer">
        @Html.TextBoxFor(m => m.Name, new { style = "width: 200px" })
        @Html.ValidationMessageFor(m => m.Name)
    </div>
    <div class="labelContainer">
        @Html.LabelFor(m => m.EmailAddress)
    </div>
    <div class="elementContainer">
        @Html.TextBoxFor(m => m.EmailAddress, new { style = "width: 200px" })
        @Html.ValidationMessageFor(m => m.EmailAddress)
    </div>
    .
    .
    .
    .
    .
    .
</div>

UserController:
[HttpPost]
public ActionResult Edit(UserModel userModel)
{
    ModelState.AddModelError("", "This is a test");
    return PartialView("_EditPartialView", userModel);
}
like image 205
user1790300 Avatar asked Dec 20 '22 02:12

user1790300


1 Answers

Where are your scripts added? In the _layout.cshtml or in the view itself? How are you loading the view? Is it with an ajax request to show a partial view?

If you are loading the partial view through ajax or as a partial view, maybe it could be that the partial view was not yet loaded in the jquery DOM model tree.

I would try the following. Change

<div id="divFormContainerMain">
    @Html.Partial("_EditPartialView", Model)
</div>

to

<div id="divFormContainerMain">
    @Html.Partial("_EditPartialView", Model)
    <script src="/Scripts/jquery.validate.min.js" type="text/javascript"></script>
    <script src="/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>
</div>

or

<div id="divFormContainerMain">
    @Html.Partial("_EditPartialView", Model)
    @Scripts.Render("~/bundles/jqueryval") //if you have a bundle for it
</div>

My advice is anyway to load the validate and unobtrusive scripts only when you need them and not in the _layout.cshtml page.

Also don't forget to enable the following appSettings in the web.config

    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
like image 156
Bastaspast Avatar answered Jan 13 '23 14:01

Bastaspast