2013-07-24 4 views
3

Я пытаюсь использовать Ajax.BeginForm для отправки данных контроллеру. В случае конкретных ошибок форма должна повторно отобразить и отобразить пользовательское сообщение об ошибке, которое было добавлено в ModelState. По какой-то причине сообщение об ошибке не отображается. Я даже пытаюсь выполнить следующий тестовый пример, который не работает, я чего-то не хватает?Ajax.BeginForm не работает с Html.ValidationSummary

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); 
} 

ответ

5

Убедитесь, что вы включили jquery.unobtrusive-ajax.js скрипт на ваш взгляд после того, как сам JQuery. В противном случае помощник Ajax.BeginForm не будет делать то, что вы думаете, что делает:

<script type="text/javascript" src="@Url.Content("~/scripts/jquery-YOUR-VERSION.js")"></script> 
<script type="text/javascript" src="@Url.Content("~/scripts/jquery.unobtrusive-ajax.js")"></script> 
+0

Здесь находятся записи скрипта: user1790300

+0

Я не могу видеть, что' jquery.unobtrusive-ajax.js' включен куда угодно. Вот почему ваш код, вероятно, не работает, как объяснено в моем ответе. Убедитесь, что вы включили этот скрипт. –

+0

К сожалению: user1790300

6

Где добавлены сценарии? В _layout.cshtml или в самом представлении? Как вы загружаете представление? Это с запросом ajax, чтобы показать частичное представление?

Если вы загружаете частичный вид через ajax или как частичный вид, возможно, может быть, что частичный вид еще не загружен в дереве модели jQuery DOM.

Я бы попробовал следующее. Изменение

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

в

<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> 

или

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

Мой совет: в любом случае, чтобы загрузить проверки и ненавязчивые скрипты только тогда, когда вы нуждаетесь в них, а не на странице _layout.cshtml.

Также не забудьте включить следующие AppSettings в web.config

<add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
+0

+1 для предложения web.config - это было именно то, чего мне не хватало! –

Смежные вопросы