如果ModelState无效,ASP.NET MVC AJAX会更改UpdateTargetId

时间:2009-04-09 13:47:06

标签: asp.net asp.net-mvc

我使用内部有两个局部视图的视图。

<div id="matches">
    <% foreach (var item in Model)
       { %>
    <% Html.RenderPartial("RenderMatchesListRowUserControl", item); %>
    <% } %>
</div>
<div id="addMatchFormBox">    
    <% Html.RenderPartial("AddNewMatchUserControl");%>
</div>

第一个局部视图“RenderMatchesListRowUserControl”呈现一个简单的div元素(用于匹配列表),第二个“AddNewMatchUserControl”呈现一个表单以在列表下创建一个新匹配:

AddNewMatchUserControl的来源:

<%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>

<% using (Ajax.BeginForm("Create", new AjaxOptions
   {
       UpdateTargetId = "matches",
       InsertionMode = InsertionMode.InsertAfter,
       OnSuccess = "flashit",
       OnFailure = "renderForm"
   }))
   {%>
<fieldset>
    <legend>New Match</legend>
    <p>
        <label for="DurationBetweenMovesInDays">
            Dauer (in Tagen) zwischen den Z&uuml;gen:</label>
        <%= Html.TextBox("DurationBetweenMovesInDays")%>
        <%= Html.ValidationMessage("DurationBetweenMovesInDays", "*")%>
    </p>
    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
<% } %>

根据ModelState,控制器返回新匹配条目的部分视图或表单的部分视图,以显示模型错误。

if (Request.IsAjaxRequest()) {
            return ModelState.IsValid ?    PartialView("RenderMatchesListRowUserControl", match) : PartialView("AddNewMatchUserControl");
        }

它工作正常,直到ModelState变为无效。在这种情况下,表单将在匹配列表的末尾呈现,因为updatetargetid引用包含匹配列表的div元素。为避免这种情况,必须更改updatetargetid以引用包含表单的div元素。但我不知道该怎么做。

2 个答案:

答案 0 :(得分:0)

我有同样的问题。如果模型状态无效,我想更新包含表单的div中的内容,如果成功保存,则要更新数据集合。因此,我使用的技巧不是使用“ UpdateTargetId”。我使用“ OnSuccess”进行处理。

这里是一个例子。

    @using (Ajax.BeginForm("SaveUser", new AjaxOptions{
HttpMethod = "Post",
LoadingElementId = "save-progress",
OnSuccess = "onUpdateSuccess"
InsertionMode = InsertionMode.Replace}))

这是一个JavaScript示例。

function onUpdateSuccess(response, xhr) {
     $('#progress-bar').css({ 'display': 'none' });
     if (response.indexOf('form') != -1) {
        $('#addOrEditUserForm').html(response);

     } else {
       $('#user-table').html(response);
       $('#addOrEditUserForm').html('')
 }

};

答案 1 :(得分:-2)

还好。没有办法以这种方式实现这一目标。我用jQuery解决了它。