Javascript 根据模型验证,显示弹出消息或视图

Javascript 根据模型验证,显示弹出消息或视图,javascript,jquery,ajax,asp.net-mvc,Javascript,Jquery,Ajax,Asp.net Mvc,想象一下,在签出过程中有一个包含多个步骤(视图)的webshop。当客户按下“下一步”按钮时,将调用相应的“操作”方法。在这种方法中,会进行一些验证,检查客户是否可以继续,或者订单是否有问题。根据验证结果,我希望发生以下两种情况之一: A) 将生成并显示下一个视图 B) 客户停留在当前页面中,但会弹出一个模式对话框,其中包含一条错误消息 我已经尝试了在网络上找到的几种方法,但到目前为止没有任何效果。我最后尝试的是使用AJAX,但实际上我不知道这是否是正确的方法 public ActionResu

想象一下,在签出过程中有一个包含多个步骤(视图)的webshop。当客户按下“下一步”按钮时,将调用相应的“操作”方法。在这种方法中,会进行一些验证,检查客户是否可以继续,或者订单是否有问题。根据验证结果,我希望发生以下两种情况之一:

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

是否要在模式弹出窗口中显示局部视图?如果是这样的话,您可以使用jQueryAjax方法,就像您已经做过的那样,但是将其与jQueryPop-up/lightbox插件相结合,以显示生成的HTML


因此,在您的代码中,“/Home/SomeAction”是弹出窗口的PartialView,从控制器返回一个“PartialView”,当您在JQuery“success:”事件中收到HTML时,可以使用(例如)“JQuery Colorbox”来显示它(参见此处:)

无需ajax检查表单,为什么不使用几行javascript?比如“点击时,如果‘e-mail’输入字段为空,则抛出警报”等等。有很多表单验证插件,比如,只需谷歌一下


请参阅:

很难说您希望如何实现这样的工作流,但我想到的一件事是返回值,即TempData store中的错误,并正确重定向到下一步,或者验证失败到同一步

对于这样的简单模型:

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();
    }
}
$.post("@Url.Action("Index")", values, function(data) {
    // add logic for loading next page or error
});
控制器的一些代码示例如下所示:

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();
    }
}
$.post("@Url.Action("Index")", values, function(data) {
    // add logic for loading next page or error
});
在视图方面:

@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>
}
在对象中,您必须使用适当的结构构建自己


祝你好运

不完全是。如果模型有效,我想显示一些连接到该操作的视图,但如果不是,我想保持在当前视图中,并显示一个弹出框,其中包含来自模型验证的一些错误消息。啊,我明白了,听起来您可能需要稍微扩展Jquery的非干扰性验证,以便在屏幕上出现的标准错误不够多的情况下显示弹出式错误。本例中的模型验证有点复杂,我不希望它泄漏到视图中。啊。这是我以前没有的一些信息在这样的场景中通常的工作流程是什么?如果这只是C#/.NET,我就不会有问题了,但是再加上一些JavaScript和HTML,我就完全迷路了。如果我回到同一步,这难道不像视图重新加载那样对用户可见吗?如果发生错误,我希望保持在同一个视图中,不会发生任何事情,只会弹出一个错误。我对示例进行了一些修改。Index()中的return view()将重新加载页面,对吗?返回一个显示错误框的脚本可以吗?或者这被认为是错误的做法吗?如果您在Index()中,这意味着已经有一些对服务器的请求,则返回视图会指示MVC生成html并将其返回给客户端。您可以使用JavaScriptResult返回javascript-