Ajax.BeginForm将Partial显示为新页面

时间:2010-10-25 01:47:38

标签: c# .net ajax asp.net-mvc-2

我有一个部分视图,我在我的主页/索引页面上呈现。它是一个简短的表单,带有用于验证的视图模型和注释。

它调用控制器并且在失败时(因为我没有输入任何内容并且我在视图模型中有[Required]标签)它将部分视图重新呈现为新页面。

我的问题是我必须自己返回JSON并标记表单无效字段吗?或者我可以使用正常返回PartialView(模型)吗?

我已经包括:

    <script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script>
    <script src="/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>

部分视图

<%using (Ajax.BeginForm("Coupon", new AjaxOptions { HttpMethod = "Post", OnSuccess = "CouponSubmitted" }))
      { %>
    <div style="top: 337px; position: relative;">
        <div style="margin-left: 51px; float: left;">
            <%= Html.TextBoxFor(p => p.Name, new { Style = "width:130px;" })%>
            <%= Html.ValidationMessageFor(p => p.Name)%>
        </div>
        <div style="float: left; margin-left: 44px;">
            <%= Html.TextBoxFor(p => p.PhoneNumber, new { Style = "width:130px;" })%>
            <%= Html.ValidationMessageFor(p => p.PhoneNumber)%>
        </div>
        <div style="float: left; margin-left: 34px; width: 80px;">
            <%= Html.TextBoxFor(p=>p.Extension, new { Style = "width:70px;" })%>
            <%= Html.ValidationMessageFor(p => p.Extension)%>
        </div>
        <div style="clear: both;">
        </div>
    </div>
    <div style="top: 354px; position: relative;">
        <div style="margin-left: 51px; float: left;">
            <%= Html.TextBoxFor(p => p.Email, new { Style = "width:130px;" })%>
            <%= Html.ValidationMessageFor(p => p.Email)%>
        </div>
        <div style="float: left; margin-left: 44px;">
            <%= Html.TextBoxFor(p=>p.CellNumber,new{Style="width:130px;"})%>
            <%= Html.ValidationMessageFor(p => p.CellNumber)%>
        </div>
        <input style="float: left; margin-left: 34px;"  type="submit" value="Submit" />
        <div style="clear: both;">
        </div>
    </div>
    <%} %>

控制器

        [HttpPost]
        public ActionResult Coupon(Web.ViewModels.CouponViewModel model)
        {
            if (ModelState.IsValid)
            {
                //Submit info
                Response.Cookies["ShowCoupon"].Value = "false";
                Response.Cookies["ShowCoupon"].Expires = DateTime.Now.AddMinutes(2);
                return Json(new {success=true});
            }
            else
            {
                return PartialView(model);
            }

        }

1 个答案:

答案 0 :(得分:1)

我可以看到两点需要改进。

1)尝试用Ajax.ActionLink替换“提交”按钮。原因是您的“提交”按钮导致完全回发而不是Ajax请求。

2)一旦完全回发,您将在失败的情况下返回完整的部分视图。这导致您的主表单消失,只剩下部分视图。

如前所述,要解决这些问题,请使用Ajax.ActionLink替换Submit按钮,然后当模型出现故障时,请不要返回PartialView。在你成功的流程中回归Json。

HTH