Каким должен быть тип возвращаемого значения MVC ActionResult для внешнего сообщения HTML ajaxForm

Идея состоит в том, чтобы отправить данные формы с обычной внешней страницы Html на другой контроллер сайта MVC. Затем данные обрабатываются почти так же, как при использовании веб-сервиса.

$(document).ready(function () {
  var options = {
    target: '#output',
    success: function(data){ alert('test success'); },
    url: http://localhost:57232/Services/SendFormData,
    dataType:  json
  };

  $('form').ajaxForm(options);
});

ActionResult правильно получает данные в объекте FormCollection.

[HttpPost]
public ActionResult SendFormData(FormCollection collection)
{
  string s = string.Empty;

  return Json(new { Success = true, Message = "Message!" }, JsonRequestBehavior.AllowGet);
}

На этом этапе возвращается результат успеха, но когда он попадает во внешнюю форму, мой браузер, которым в данном случае является IE, пытается сохранить или открыть возвращенные байты вместо вызова функции обратного вызова успеха.

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


person Kosmosniks    schedule 11.05.2011    source источник
comment
Ваш целевой параметр сообщает плагину формы заменить данные в #output возвращенными данными. Я бы избавился от этого для тестирования и просто положился бы на функцию успешного обратного вызова. Кроме того, я думаю, вам нужно будет заключить URL-адрес в кавычки.   -  person BZink    schedule 12.05.2011
comment
Есть ли вероятность, что ваша форма содержит поля для загрузки файлов?   -  person Darin Dimitrov    schedule 12.05.2011
comment
Привет, нет полей для загрузки, большинство полей - это скрытый тип ввода, который будет использоваться на стороне сервера после публикации, идея состоит в том, чтобы обойти строку запроса, которая может ограничить объем данных. Я заключил URL-адрес в кавычки и удалил целевой параметр. В обоих случаях остались с одной и той же проблемой. Это даже не вызывает событие успеха.   -  person Kosmosniks    schedule 12.05.2011


Ответы (1)


Вам нужно вернуть результат частичного просмотра:

    [HttpPost]
    public ActionResult Form(Comment feedback)
    {
        if (feedback != null)
        {
            feedback.CommentedOn = DateTime.Now;
            feedback.CommentId += 1;
            if (ModelState.IsValid)
            {
                BlogPost blogpost = db.BlogPosts.Find(feedback.BlogId);
                if (blogpost != null)
                    blogpost.NoofComments += 1;
                db.Entry(blogpost).State = EntityState.Modified;
                db.Entry(feedback).State = EntityState.Modified;
                db.Comments.Add(feedback);
                db.SaveChanges();
                return PartialView("CommentSuccess", feedback);
            }
        }
        return PartialView("Comment", feedback);
    }

Также в AjaxForm вам нужно установить UpdateTargetID:

@using (Ajax.BeginForm("Form", new AjaxOptions() { UpdateTargetId = "FormContainerdiv"     , OnSuccess = "$.validator.unobtrusive.parse('form');", OnComplete = "OnComplete();" }))

в targetId формы Ajax вам нужно указать идентификатор div, в котором вы должны отображать данные ответа.

<div id="FormContainerdiv">.</div>
@Html.Partial("Comment", item);
</div>
person Jayprakash S T    schedule 28.12.2011
comment
Спасибо, я думаю, это может решить мою проблему, и я протестирую как можно скорее. Однако меня немного беспокоит синтаксис Razor на вызывающей странице Html, поскольку это обычная страница Html, а не представление MVC. - person Kosmosniks; 03.01.2012