Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于局部视图的AJAX模型验证_Ajax_Asp.net Mvc - Fatal编程技术网

基于局部视图的AJAX模型验证

基于局部视图的AJAX模型验证,ajax,asp.net-mvc,Ajax,Asp.net Mvc,我有一个局部视图,它是一个作为弹出窗口的登录。我只想让我的模型进行验证(服务器端),并通过AJAX返回任何错误。下面的代码仅返回带有错误的局部视图。我希望我的操作结果不返回视图,而只返回错误。在旧的ASP.NET中,这将是一个部分回帖。我不知道如何在MVC中实现这一点 这是模型 public class LoginModel { [Required] public String Email { get; set; } [Required] [DataType(Da

我有一个局部视图,它是一个作为弹出窗口的登录。我只想让我的模型进行验证(服务器端),并通过AJAX返回任何错误。下面的代码仅返回带有错误的局部视图。我希望我的操作结果不返回视图,而只返回错误。在旧的ASP.NET中,这将是一个部分回帖。我不知道如何在MVC中实现这一点

这是模型

public class LoginModel
{
    [Required]
    public String Email { get; set; }
    [Required]
    [DataType(DataType.Password)]
    public String Password { get; set; }

}
这是局部视图

@model MySite.Models.LoginModel
@using (Ajax.BeginForm("Authenticate", "Account", null, new AjaxOptions { OnFailure = "error" }, new { id = "LoginForm" }))
{

我的控制器操作:

 [HttpPost]
 [Route("account/authenticate")]
 public ActionResult Authenticate(String companyCode, LoginModel model)
        {
    if (!ModelState.IsValid)
        {

            // ??
        }
    return PartialView("Login", model);
 }

由于您的代码正在为登录进行ajax表单提交,因此您应该尝试从服务器返回JSON响应。如果模型验证失败,您可以从模型状态字典中读取验证错误,并将其存储在字符串集合(错误消息)中如果模型验证通过,您可以继续执行代码来验证登录凭据,如果这些凭据看起来不错,则返回一个json响应,其中包含用户的下一个url(我们可以将用户重定向到该url)

现在在您的视图中,您可以指定一个
OnSuccess
处理程序作为AjaxOptions的一部分。这将是一个javascript对象,服务器的json响应将指向该对象。我们基本上需要检查Status属性值并执行相应的操作

new AjaxOptions { OnFailure = "error" , OnSuccess="loginDone"}
下面的loginDone实现只是警告错误消息。您可以更新它以将其显示为DOM的一部分

function loginDone(d) {
    if (d.Status === "Success") {
        window.location.href = d.Url;
    } else {
        $.each(d.Errors,function(a, b) {
                alert(b);
        });
    }
}

您还可以考虑启用不显眼的客户端验证,该客户端验证在尝试对服务器进行调用之前进行客户端验证。这也将显示验证错误跨度中的错误消息(与常规MVC模型验证相同)

[HttpPost]
public ActionResult Authenticate(String companyCode, LoginModel model)
{
    if (!ModelState.IsValid)
    {
        var errors = ViewData.ModelState.Values
                             .SelectMany(x => x.Errors.Select(c => c.ErrorMessage));
        return Json(new { Status = "Error", Errors = errors });
    }

    //to do  :Verify login, if good, return the below respose
    var url=new UrlHelper(Request.RequestContext);
    var newUrl = url.Action("About");
    return Json(new { Status="Success", Url = newUrl});
}
new AjaxOptions { OnFailure = "error" , OnSuccess="loginDone"}
function loginDone(d) {
    if (d.Status === "Success") {
        window.location.href = d.Url;
    } else {
        $.each(d.Errors,function(a, b) {
                alert(b);
        });
    }
}