MVC3 Ajax Получить строку и опубликовать его обратно - PullRequest
0 голосов
/ 11 апреля 2011

при загрузке страницы MVC3 у меня есть строка в модели, которая должна быть JSONObj.

private string CreateJSONObj(Model model)
{ return "{ name: 'test', Items: [{ test: 1 }, { test: 2 }]"; }

Model.jsonModel = CreateJSONObj(model);

Теперь я хочу реализовать ее на своей странице:Контроллер получает нулевой объект.Если я напишу jsonstring в сценарий, все будет хорошо.

Должен ли я использовать eval?Но var jsModel = eval ('@ Model.jsonModel');не имеет никакого эффектаЧто случилось?: -)

1 Ответ

5 голосов
/ 11 апреля 2011

Вам не нужно использовать метод CreateJSONObj или свойство jsonModel в вашей модели. Чтобы использовать его в представлении, вы можете просто использовать класс JavaScriptSerializer , который преобразует объект модели на стороне сервера в объект javascript:

<script type="text/javascript">
    var jsModel = @Html.Raw(new JavaScriptSerializer().Serialize(Model));
    $.ajax({
        url: '@Url.Action("SetJSON", "Page")',
        type: 'POST',
        data: JSON.stringify(jsModel),
        contentType: 'application/json; charset=utf-8',
        success: function () {
            $('#test').html('Saved').fadeIn();
        },
        error: function () {
            $('#test').html('error');
        }
    });
</script>

Это успешно отправит модель на следующее действие контроллера:

[HttpPost]
public ActionResult SetJSON(Model model)
{
    ...
}

где класс Model содержит всю необходимую информацию:

public class Model
{
    public string Name { get; set; }
    public IEnumerable<Item> Items { get; set; }
}

public class Item
{
    public int Test { get; set; }
}

и контроллер:

public class PageController: Controller
{
    // Used to render the view
    public class Index()
    {
        var model = new Model
        {
            Name = "Test",
            Items = new[]
            {
                new Item { Test = 1 },
                new Item { Test = 2 },
            }
        };    
        return View(model);
    }

    // Used to handle the AJAX POST request
    [HttpPost]
    public ActionResult SetJSON(Model model)
    {
        ...
    }
}
...