Связывание и отправка модели через ajax - PullRequest
2 голосов
/ 27 мая 2011

Я хочу опубликовать форму с помощью вызова ajax, также модель будет передана в метод действия, но я хочу получать ошибки модели через json.Как я могу это сделать?

Ответы [ 2 ]

3 голосов
/ 27 мая 2011

Вы можете написать собственный фильтр действий:

public class HandleJsonErrors : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var modelState = (filterContext.Controller as Controller).ModelState;
        if (!modelState.IsValid)
        {
            // if the model is not valid prepare some JSON response
            // including the modelstate errors and cancel the execution
            // of the action.
            // TODO: This JSON could be further flattened/simplified
            var errors = modelState
                .Where(x => x.Value.Errors.Count > 0)
                .Select(x => new
                {
                    x.Key,
                    x.Value.Errors
                });
            filterContext.Result = new JsonResult
            {
                Data = new { isvalid = false, errors = errors }
            };
        }
    }
}

и затем запустить его в действие.

Модель:

public class MyViewModel
{
    [StringLength(10, MinimumLength = 5)]
    public string Foo { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    [HandleJsonErrors]
    public ActionResult Index(MyViewModel model)
    {
        // if you get this far the model was valid => process it
        // and return some result
        return Json(new { isvalid = true, success = "ok" });
    }
}

и, наконец, запрос:

$.ajax({
    url: '@Url.Action("Index")',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify({
        foo: 'abc'
    }),
    success: function (result) {
        if (!result.isvalid) {
            alert(result.errors[0].Errors[0].ErrorMessage);
        } else {
            alert(result.success);
        }
    }
});
1 голос
/ 27 мая 2011

Как то так?

  $.ajax({
                    type: "POST",
                    url: $('#dialogform form').attr("action"),
                    data: $('#dialogform form').serialize(),
                    success: function (data) {
                        if(data.Success){
                          log.info("Successfully saved");
                          window.close();
                        }
                        else {
                          log.error("Save failed");
                          alert(data.ErrorMessage);
                    },
                    error: function(data){
                        alert("Error");
                    }
                });


    [HttpPost]
    public JsonResult SaveServiceReport(Model model)
    {
        try
        {
            //
        }
        catch(Exception ex)
        {
            return Json(new AdminResponse { Success = false, ErrorMessage = "Failed" }, JsonRequestBehavior.AllowGet);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...