显示弹出消息或视图,具体取决于模型验证

时间:2015-02-19 11:00:17

标签: javascript jquery ajax asp.net-mvc

想象一下在结账时有几个步骤(视图)的网上商店。当客户按下“下一步”时,按钮,相应的'动作'方法被调用。在该方法中,进行了一些验证,检查客户是否可以继续进行,或者订单是否有问题。根据验证结果,我想要发生以下两件事之一:

A)生成并显示下一个视图。

B)客户留在当前页面,但会弹出一个模态对话框,其中包含错误消息。

我已经尝试了几种在网络上发现的方法,但到目前为止还没有任何工作。我尝试过的最后一件事是使用AJAX,但我真的不知道这是否是正确的方法。

public ActionResult SomeAction()
{
    if (ModelState.IsValid)
    { 
        return View();
    }
    // If not valid
    return errorMessage          
}


$(document).ready(function () {
    $("#btn").click(function () {
        $.ajax({
            url: "/Home/SomeAction",
            async: true,
            success: function (result) {
                if (!result.success) {
                    alert(result.error);
                }
                // Else display view
            }
        });

3 个答案:

答案 0 :(得分:0)

是否要在模式弹出窗口中显示局部视图?如果是这样,您可以使用已经完成的JQuery AJAX方法,但将其与JQuery弹出/灯箱插件结合使用,以显示生成的HTML。

所以,在你的代码中" / Home / SomeAction"是弹出窗口的PartialView返回" PartialView"来自你的Controller,当你在JQuery中收到HTML时,成功:"事件,也许使用(例如)" Jquery Colorbox"显示它(见这里:http://www.jacklmoore.com/colorbox/

答案 1 :(得分:0)

很难说你想如何实现这样的工作流程,但我想到的一件事就是用ie返回值。 TempData存储中的错误并正确地重定向到下一步,或者验证失败到同一步骤。

对于这样的简单模型:

public class Cart
{
    [Required]
    public string Item { get; set; }

    [Required]
    public string Quantity { get; set; }
}

控制器的一些代码示例如下所示:

public class CartController : Controller
{
    //
    // GET: /Cart/
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(Cart model)
    {
        if (ModelState.IsValid)
            return RedirectToAction("Step1");

        TempData["Error"] = "Validation failed";
        return View();
    }

    public ActionResult Step1()
    {
        // add more logic, steps etc
        return View();
    }
}

在观点方面:

@using (Html.BeginForm())
{
     <fieldset>
       <p>
            <label for="Id">Item:</label>
            @Html.TextBox("Item") 
            @Html.ValidationMessage("Item", "*")
            @Html.Editor("Quantity")
       </p> 
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

@if (TempData["Error"] != null)
{
    <p>Please fix all errors!</p>
}

我可能会将其嵌入到查看母版页中,即。只针对那些步骤。

编辑:更改了一些代码添加了更多真实世界的例子:-) 顺便说一句。请记住,使用这种机制,您将免费获得MVC框架的验证,以便在需要时突出显示您的字段。如果需要,您也可以稍后将此模型传递给其他步骤。总的来说,这是一个很好的验证入门指南:http://www.asp.net/mvc/overview/older-versions/getting-started-with-aspnet-mvc4/adding-validation-to-the-model

如果您想采用AJAX方式,那么您可以使用以下内容:

$.post("@Url.Action("Index")", values, function(data) {
    // add logic for loading next page or error
});

值对象你必须用适当的结构构建自己。

祝你好运!

答案 2 :(得分:-1)

不需要ajax来检查表单,为什么不只是几行javascript?比如“点击,如果'电子邮件'输入字段为空,则发出警告”等。有许多表单验证插件,如jQuery inline form validation,只是google it。

请参阅:http://www.w3schools.com/js/js_validation.asp