我有2个视图模型,1个用于设置搜索参数,另一个用于搜索结果。
搜索模型:
var CustomerSearchViewModel = {
SearchType: ko.observable(""),
SearchString: ko.observable(""),
setSearchType: function (data, element) {
this.SearchType($(element.target).val());
}
}
结果模型:
var CustomerSearhResultViewModelDS = function (data) {
var self = this;
self.CustomerID = ko.observable(data.CustomerID);
self.CompanyName = ko.observable(data.CustomerName);
self.CustomerEMail = ko.observable(data.CustomerEMail);
self.CustomerTelephone = ko.observable(data.CustomerTelephone);
self.CustomerCompanyName = ko.observable(data.CustomerCompanyName);
self.CustomerCompanyAddress1 = ko.observable(data.CustomerCompanyAddress1);
self.CustomerCompanyAddress2 = ko.observable(data.CustomerCompanyAddress2);
self.CustomerCompanyZipCode = ko.observable(data.CustomerCompanyZipCode);
}
var CustomerSearhResultViewModel = function (Customer) {
var self = this;
self.Customer = ko.observableArray(Customer);
$.ajax({
url: "CreateOrder.aspx/CustomerSearch",
data: { SearchType: CustomerSearchViewModel.SearchType(), SearchString: CustomerSearchViewModel.SearchString() },
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "JSON",
timeout: 10000,
success: function (Result) {
var MappedCustomer =
$.map(Result.d,
function (item) {
return new CustomerSearhResultViewModelDS(item);
}
);
self.Customer(MappedCustomer);
},
error: function (xhr, status) {
alert(status + " - " + xhr.responseText);
}
});
};
我的后端代码:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static List<CustomerAddress> CustomerSearch(int SearchType, string SearchString)
{
//int Converted;
//Int32.TryParse(SearchType,out Converted);
nopcommerce144Entities entities = new nopcommerce144Entities();
List<CustomerAddress> json = null;
switch (SearchType)
{
case 0:
json = (from cr in entities.Addresses
where cr.Company.Contains(SearchString)
select new CustomerAddress()
{
CustomerCompanyName = cr.Company,
CustomerID = (from cid in entities.Affiliates
join cus in entities.Customers on cid.Id equals cus.AffiliateId
where cid.AddressId == cr.Id
select (int)cus.Id).First(),
CustomerCompanyAddress1 = cr.Address1,
CustomerCompanyAddress2 = cr.Address2,
CustomerCompanyZipCode = cr.ZipPostalCode,
CustomerName = cr.FirstName + " " + cr.LastName,
CustomerTelephone = cr.PhoneNumber,
CustomerEMail = cr.Email
}
).ToList();
break;
case 1:
json = (from cr in entities.Addresses
where cr.City.Contains(SearchString)
select new CustomerAddress()
{
CustomerCompanyName = cr.Company,
CustomerID = (from cid in entities.Affiliates
join cus in entities.Customers on cid.Id equals cus.AffiliateId
where cid.AddressId == cr.Id
select (int)cus.Id).First(),
CustomerCompanyAddress1 = cr.Address1,
CustomerCompanyAddress2 = cr.Address2,
CustomerCompanyZipCode = cr.ZipPostalCode,
CustomerName = cr.FirstName + " " + cr.LastName,
CustomerTelephone = cr.PhoneNumber,
CustomerEMail = cr.Email
}
).ToList();
break;
case 2:
json = (from cr in entities.Addresses
where cr.ZipPostalCode.Contains(SearchString)
select new CustomerAddress()
{
CustomerCompanyName = cr.Company,
CustomerID = (from cid in entities.Affiliates
join cus in entities.Customers on cid.Id equals cus.AffiliateId
where cid.AddressId == cr.Id
select (int)cus.Id).First(),
CustomerCompanyAddress1 = cr.Address1,
CustomerCompanyAddress2 = cr.Address2,
CustomerCompanyZipCode = cr.ZipPostalCode,
CustomerName = cr.FirstName + " " + cr.LastName,
CustomerTelephone = cr.PhoneNumber,
CustomerEMail = cr.Email
}
).ToList();
break;
case 3:
json = (from cr in entities.Addresses
where cr.FirstName.Contains(SearchString) || cr.LastName.Contains(SearchString)
select new CustomerAddress()
{
CustomerCompanyName = cr.Company,
CustomerID = (from cid in entities.Affiliates
join cus in entities.Customers on cid.Id equals cus.AffiliateId
where cid.AddressId == cr.Id
select (int)cus.Id).First(),
CustomerCompanyAddress1 = cr.Address1,
CustomerCompanyAddress2 = cr.Address2,
CustomerCompanyZipCode = cr.ZipPostalCode,
CustomerName = cr.FirstName + " " + cr.LastName,
CustomerTelephone = cr.PhoneNumber,
CustomerEMail = cr.Email
}
).ToList();
break;
case 4:
json = (from cr in entities.Addresses
where cr.PhoneNumber.Contains(SearchString)
select new CustomerAddress()
{
CustomerCompanyName = cr.Company,
CustomerID = (from cid in entities.Affiliates
join cus in entities.Customers on cid.Id equals cus.AffiliateId
where cid.AddressId == cr.Id
select (int)cus.Id).First(),
CustomerCompanyAddress1 = cr.Address1,
CustomerCompanyAddress2 = cr.Address2,
CustomerCompanyZipCode = cr.ZipPostalCode,
CustomerName = cr.FirstName + " " + cr.LastName,
CustomerTelephone = cr.PhoneNumber,
CustomerEMail = cr.Email
}
).ToList();
break;
case 5:
json = (from cr in entities.Addresses
where cr.Email.Contains(SearchString)
select new CustomerAddress()
{
CustomerCompanyName = cr.Company,
CustomerID = (from cid in entities.Affiliates
join cus in entities.Customers on cid.Id equals cus.AffiliateId
where cid.AddressId == cr.Id
select (int)cus.Id).First(),
CustomerCompanyAddress1 = cr.Address1,
CustomerCompanyAddress2 = cr.Address2,
CustomerCompanyZipCode = cr.ZipPostalCode,
CustomerName = cr.FirstName + " " + cr.LastName,
CustomerTelephone = cr.PhoneNumber,
CustomerEMail = cr.Email
}
).ToList();
break;
}
return json;
}
我想通过此行的Ajax帖子将CustomerSearchViewModel中的值传递给CustomerSearchResult:
{ SearchType: CustomerSearchViewModel.SearchType(), SearchString: CustomerSearchViewModel.SearchString() },
执行时我收到以下错误: * {“消息”:“无效的JSON原语:SearchType。”,“StackTrace”:“在System.Web.Script的System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\ r \ n” System.Web.Script.Serialization.JavaScriptSerializer中的System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input,Int32 depthLimit,JavaScriptSerializer serializer)\ r \ n中的.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\ r \ n \ n \ n .Deserialize(JavaScriptSerializer序列化程序,字符串输入,类型类型,Int32 depthLimit)\ r \ n在System.Web.Script.Script.Services上的System.Web.Script.Serialization.JavaScriptSerializer.Deserialize [T](字符串输入)\ r \ n .RestHandler.GetRawParamsFromPostRequest(HttpContext上下文,JavaScriptSerializer序列化程序)\ r \ n在System.Web.Script.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData,HttpContext context)\ r \ n在System.Web.Script.Services.RestHandler.ExecuteWebServiceCall上(HttpContext conte xt,WebServiceMethodData methodData)“,”ExceptionType“:”System.ArgumentException“} *
答案 0 :(得分:1)
您应该使用值而不是字符串作为数据对象传递。
这应该是:
data: {CustomerSearchViewModel.SearchType(), CustomerSearchViewModel.SearchString()}
你也应该把它称为函数,因为它是可观察的。
您还应该在FireBug或其他控制台工具中检查JSON发送服务器的内容。
我希望它有所帮助