2012-06-04 4 views
1

Мне нужна помощь снова с Asp.Net MVC (Razor View Engine). На мой взгляд (индекс) У меня естьMVC3 (Razor) Json Получить десериализованные данные в контроллере

@model IEnumerable<Movie> 

Я хочу передать модель к контроллеру: Я stringify модель таким образом:

<script type="text/javascript"> 
function postData(){ 
var urlact='@Url.Action("createDoc")'; 
var model ='@Html.Raw(Json.Encode(Model)); 

$.ajax({ 
    data: JSON.stringify(model), 
    type:"POST", 
    url:urlact, 
    datatype:"json", 
    contentType:"application/json; charset=utf-8" 
}); 
} 
</script> 

Все, кажется, работает, потому что я знаю, строковой данные:

'[{"ID":1,"Title":"The Lord of the Rings: The Fellowship of the Ring","ReleaseDate":"\/Date(1007938800000)\/","Genre":"Fantasy","Price":93000000.00},{"ID":2,"Title":"The Lord of the Rings: The Two Towers","ReleaseDate":"\/Date(1039042800000)\/","Genre":"Fantasy","Price":94000000.00},{"ID":3,"Title":"The Lord of the Rings: The Return of the King","ReleaseDate":"\/Date(1070233200000)\/","Genre":"Fantasy","Price":94000000.00}]'; 

проблема заключается в том: в контроллере, имяМетода «createDoc» (как заявлено в сценарии) не может получить доступ к строковым данным. После некоторых образцов, основанные на Интернете, мой метод что-то вроде этого:

[HttpPost] 
    public ActionResult createDoc(IEnumerable<Movie> movies) 
    { 
     //...using movies list 
     return View(); 
    } 

Почему я не могу получить доступ к строковым данным? Как я могу это сделать, есть ли способ вызвать десериализацию модели в методе Controller? Кроме того, могу ли я использовать метод serialize() вместо stringify()? Если да, то какой синтаксис, View & Сторона контроллера?

спасибо.

+0

Какая ошибка вы получаете? Является ли параметр movies нулевым? Это вообще ошибка? – Dismissile

+0

Нет, я просто ничего не могу сделать для своего действия createDoc. Кажется, что ничего не отправлено на это. (Я не знаю, может быть, объявление для входного параметра неверно) – Jack88PD

ответ

3

У вас уже есть строгие данные в переменной JavaScript model. Вам нужно только позвонить JSON.stringify на объекты, которые не являются строками.

Если вы хотите разместить данные на ваши действия без изменения model, просто пройти в model без JSON.stringify и ModelBinder будет заботиться о десериализации его IEnumerable<Movie> для вас.

Если вы хотите использовать model как нечто, отличное от строки, вам нужно позвонить JSON.parse на строку. Другими словами:

var model = JSON.parse('@Html.Raw(Json.Encode(Model))'); 

Затем вы хотите сохранить ваш JSON.stringify вызов.

Наконец, stringify представляет собой метод на объекте JSON браузера конкретно, в то время как serialize представляет собой метод на ASP.NET MVC-специфического Json объекта. Два разных мира, одно и то же имя.

+0

Не нужно использовать JSON.parse в этом случае, потому что HTML.Raw уже вернет raw json. Так просто сделайте это: 'var model = JSON.parse ('@ Html.Raw (Json.Encode (Model))';' – maxcnunes

+0

Это хорошо, за исключением того, что вам нужно избегать каких-либо одиночных кавычек '' 'в вашей json-строке. 'JSON.parse ('@ Html.Raw (Json.Encode (Model) .Replace ("' "," \\ '"))');' – styfle

Смежные вопросы