2013-09-30 3 views
1

Я использую нокаут, а модель, которую я использую, содержит много элементов. Я отправляю его к контроллеру, как так:Использование объекта в Asp. Net Web Api

ajaxRequest("post", "/api/care/saveevent?student=" + self.StudentId(),self.CurrentEvent()) 
       .done(function (allData) { 
        alert("ran ok"); 
       }) 
       .fail(function() { 
        alert("An error occurred"); 
       }); 

И мой контроллер имеет это:

public string SaveEvent(object data, int student) 
{ 
    return "test"; 
} 

Я хочу использовать объект, так что я не должен повторить все, что в модели нокаута на контроллер или где-нибудь еще, поэтому я могу изменить его один раз.

Он хорошо подходит и при отладке всего в объектных данных является правильным. Однако я не использую объект нормально и не уверен, как получить его содержимое как есть, просто помещая data.PropertyName вызывает ошибки intellisense.

Каков правильный способ получить его содержимое и что я пытаюсь сделать невозможным?

+0

Кажется, что вы ошибочно написали 'dynamic' как' object'. –

+0

Вы не можете его бросить? – Krishna

+0

вы не можете получить свойства, как вы хотите, от объекта. Вам нужно будет подвергнуть объект типу, который имеет нужные свойства. – Excommunicated

ответ

4

Если вы хотите избежать строго типизированного класса модели (C#), вы можете использовать тип dynamic.

Я бы рекомендовал вам создать класс со свойствами, к которым вы привязываетесь. Вам нужно будет внести изменения в два места, тогда, правда, но вы получите все преимущества IntelliSense и т. Д. (Кроме того, просто добавление большего количества свойств для вашего клиентского кода JavaScript без изменения серверной стороны, вероятно, в большинстве случаев будет недостаточным .)

+0

А это было то, о чем я думал, и именно то, чего я пытался избежать, спасибо. – user1166905

0

Если все, что вы хотите, является частичным обновлением, использование OData является моим предпочтительным способом.

Вот некоторые discussion об этом.

Код скопирован из этого примера:

[AcceptVerbs("PATCH")] 
public void Patch(int id, Delta<Person> person) 
{ 
    var personFromDb = _personRepository.Get(id); 
    person.Patch(personFromDb); 
    _personRepository.Save(); 
} 

используется глагол PATCH HTTP для отправки частичной модели. Таким образом, вы уменьшили накладные расходы сети, сохраняя при этом максимальный класс.

Когда вы делаете вызов ajax, просто не забудьте использовать глагол patch.

$.ajax({ 
    url: 'api/person/1', 
    type: 'PATCH', 
    data: JSON.stringify(obj), 
    dataType: 'json', 
    contentType: 'application/json', 
    success: function(callback) {    
     //handle errors, do stuff yada yada yada 
    } 
}); 

Вы можете передать объект obj только с измененными значениями. Но он все равно будет привязан к вашему типизированному классу.

0

Я бы рекомендовал использовать ViewModel для обработки объекта данных.

Учитывая ViewModel, такие как:

public class SaveEventViewModel 
{ 
    public DateTime Start { get; set; } 
    public DateTime End { get; set; } 
} 

Ваш контроллер затем будет выглядеть следующим образом:

public string SaveEvent(SaveEventViewModel data, int student) 
{ 
    SaveEvent(data, student); // I am assuming this will occur 
    return JsonConvert.SerializeObject(data); 
} 

Выгода для определения ViewModel, является то, что вы могли бы легко получить доступ ко всем членов вашей модели, из allData (на стороне клиента).

allData.Start 
allData.End 

Просто хотел дать альтернативу, поскольку динамический подход будет работать нормально - но я предпочитаю подход ViewModel.

(Обратите внимание, что JsonConvert от Newtonsoft.Json library)

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