当模型无效时,Ajax.BeginForm 正在复制

Ajax.BeginForm is duplicating when the model is not valid

提问人:Dan 提问时间:8/1/2015 更新时间:8/1/2015 访问量:720

问:

我正在编写一个PartialView Ajax.BeginForm。此部分由消息列表和用于发送新消息的字段组成,如下图所示:enter image description here

Partial 包含以下代码:

列出消息的代码

@if (Model != null)
{

    <div class="chat-activity-list" id="listaMensagens">
    @foreach (Inspinia_MVC5.Models.PostComentarios comentario in Model.Where(c => c.Usuarios.UsuEmail.Contains(User.Identity.Name) || (c.Usuarios.UsuId == c.Post.UsuId && (c.UsuariosDestinatario != null && c.UsuariosDestinatario.UsuEmail.Contains(User.Identity.Name)))).ToList())
    {
        <div class="chat-element @(comentario.UsuId == comentario.Post.UsuId ? "right" : "")">
            <a class="@(comentario.UsuId == comentario.Post.UsuId ? "pull-right" : "pull-left")" href="#">
                <img src="/Servicili/Images/a2.jpg" class="img-circle" alt="image">
            </a>
            <div class="media-body @(comentario.UsuId == comentario.Post.UsuId ? "text-right" : "")">
                <small class="@(comentario.UsuId == comentario.Post.UsuId ? "pull-left" : "pull-right") text-navy">@Inspinia_MVC5.Helpers.DateHelper.getTempo(comentario.PosComDataEnvio)</small>
                <i class="fa fa-star @(comentario.UsuId == comentario.Post.UsuId ? "text-success" : "text-warning") "></i>
                <strong>@comentario.Usuarios.Clientes.CliNome</strong>
                <p class="m-b-xs">
                    @comentario.PosComComentario
                </p>
                <small class="text-muted">@comentario.PosComDataEnvio</small>
            </div>
        </div>
    }
    </div>
}
<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>

用于发送新消息的表单代码

<div class="chat-form">
    @using (Ajax.BeginForm("EnviarMensagem", "OrcamentosServicos", new AjaxOptions() { UpdateTargetId = "listaMensagens", InsertionMode = InsertionMode.InsertAfter }))
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary()
        //@Html.HiddenFor(m => m.FirstOrDefault().Post.PostOrcamentoServico.FirstOrDefault().PosOrcSerId)
        <div class="form-group">
            @Html.TextArea("PosComComentario", new { @placeholder = "Digite uma mensagem...", @class = "form-control" })
        </div>
        <div class="text-right">
            <button type="submit" class="btn btn-sm btn-success m-t-n-xs">Enviar mensagem</button>
        </div>
    }
</div>

在我的控制器中,我有以下方法:

返回将呈现这些注释的 PartialView (邮政科门塔里奥斯)

public PartialViewResult EnviarMensagem(HashSet<PostComentarios> lComentarios)
{
    return PartialView(lComentarios); 
}

对于 [Post] 方法,我有以下代码:

[HttpPost]
public PartialViewResult EnviarMensagem(PostComentarios comentario/)
{
   if (string.IsNullOrEmpty(comentario.PosComComentario))
     ModelState.AddModelError("PosComComeentario", "Informe um texto para enviar a mensagem.");
   if (ModelState.IsValid)
     return PartialView("ListaMensagens");
   else
     return PartialView();
}

我还有另一个部分视图,仅用于呈现名为 ListaMensagens 的新消息......

我的问题是,当我尝试使用验证时,系统正在复制主表单,如下所示:

enter image description here

有人能告诉我我做错了什么吗?

C# ASP.NET-MVC-PARTIALVIEW 不显眼的 JavaScript AJAX.beginForm

评论

0赞 JamieD77 8/1/2015
div 和 div 在同一个部分吗?chat-formchat-activity-list
0赞 Dan 8/1/2015
是的,它是。但是,负责显示新项的是 UpdateTargetId“listaMensagens”
0赞 JamieD77 8/1/2015
您添加的 to if 无效时chat-formlistaMensagensModelStatereturn PartialView();
1赞 JamieD77 8/1/2015
如果您只是使用 AJAX 和 JSON 来调用一个操作,该操作将返回一个新的注释行并在成功时将其追加到列表中,或者在失败时更新错误消息,这将简单得多
0赞 Dan 8/1/2015
列表和表单位于同一部分,但是,当消息成功发送时,Ajax 将在 chat-activity-list 中插入一个新项目。

答:

0赞 John 8/1/2015 #1

据我所知,您使用的是插入模式 InsertionMode.InsertAfter,这意味着 Action 方法的结果将插入到表单中的现有数据之后。

if (ModelState.IsValid)
    return PartialView("ListaMensagens");
else
    return PartialView();

如果模型无效,则返回整个部分视图,该视图插入到表单中现有元素之后。这会导致将部分视图的整个附加副本放在现有视图之后,复制其中的所有内容,包括文本框和按钮。

评论

0赞 Dan 8/1/2015
确切地说@John,我现在的问题是如何用这种“逻辑”来做那个形式
0赞 John 8/1/2015
您可以尝试使用带有 if( Model != null ) 的 Ajax.BeginForm 将所有内容包装在
0赞 Dan 8/1/2015
我做了不同的..返回结果是呈现所有屏幕,即使包含消息列表也是如此。