Ненавязчивый вызов Ajax не отправляет View Model обратно в контроллер - PullRequest
0 голосов
/ 17 марта 2011

У меня есть этот код в моем подробном представлении cshtml. Я хочу отправить виртуальную машину обратно на этот метод контроллера. Это работает, так как я могу установить точку останова в контроллере, однако модель пуста. Вот клиентская сторона

function downLoadFile() {

    $.ajax({
        url: '/Software/DownLoadInstall',
        type: "POST",
        data: JSON.stringify('@Model'),
        datatype: "json",
        contentType: "application/json; charset=utf-8"
     });
}

и вот как выглядит мой контроллер

 [HttpPost]
    public ActionResult DownLoadInstall(SoftwareEditViewModel vm)
    {
        try
        {
            SoftwareService.DownLoadInstall(vm);  

            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

Ответы [ 2 ]

3 голосов
/ 17 марта 2011

Я думаю, что маловероятно, что сложная модель даст разумное строковое представление, которое может использовать JSON.stringify.Было бы лучше просто передать идентификатор элемента, который вы хотите загрузить обратно (предположительно, содержится в модели).Если загрузка означает то, что я думаю, она действительно должна вернуть FileResult, и вы не должны перенаправлять потом.Также нет необходимости использовать AJAX, так как загрузка файла не уведет вас со страницы.Я делаю некоторые большие предположения, основанные на ваших именах - если я ошибаюсь, вам действительно следует использовать лучшие имена.

[HttpPost]
public ActionResult DownLoadInstall(int id)
{
    return SoftwareService.DownLoadInstall( ModelFromID(id) );  
}

private SoftwareViewModel ModelFromID( id )
{
    ... populate the model needed for download from id ...
}

Клиент

function downLoadFile() {
    location.href = '/software/downloadinstall/' + @Model.ID;
}
2 голосов
/ 17 марта 2011

Вызов @Model просто вызовет ToString() для объекта.

Сначала вам нужно будет преобразовать Model в json.

Пример метода расширения

public static class JsonHelperExtensions
{
    static readonly JavaScriptSerializer Serializer = new JavaScriptSerializer();
    public static string ToJson(this object o)
    {
        return Serializer.Serialize(o);
    }
}

Тогда в вашей функции jQuery:

function downLoadFile() {

    $.ajax({
        url: '/Software/DownLoadInstall',
        type: "POST",
        data: JSON.stringify('@Model.ToJson()'),
        datatype: "json",
        contentType: "application/json; charset=utf-8"
     });
}
...