1

我正在使用淘汰赛,我正在使用的模型中有很多项目。我将它发布到这样的控制器:

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 会导致智能感知错误。

获取其内容的正确方法是什么,我试图做的事情是不可能的?

4

3 回答 3

4

如果要避免使用强类型 (C#) 模型类,可以使用该dynamic类型。

但是,我建议您使用要绑定模型的属性创建一个类。那么您将不得不在两个地方进行更改,没错,但是您将获得 IntelliSense 等的所有优势。(此外,在大多数情况下,简单地向客户端 JavaScript 代码添加更多属性而不修改服务器端可能是不够的.)

于 2013-09-30T15:15:00.907 回答
0

如果您想要的只是部分更新,那么使用 OData 是我的首选方式。

这里有一些关于它的讨论

从该示例复制的代码:

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

您使用PATCHhttp 动词来发送部分模型。通过这种方式,您减少了网络开销,同时仍然充分利用了类型化类。

当您进行 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,其中仅包含具有更改值的属性。但它仍会与您的类型化类绑定。

于 2013-09-30T15:20:24.317 回答
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 库)

于 2013-09-30T15:28:32.567 回答