从1个viewmodel获取值并用作ajax post knockoutjs中的数据

时间:2013-02-11 07:17:54

标签: knockout.js getjson

我有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“} *

1 个答案:

答案 0 :(得分:1)

您应该使用值而不是字符串作为数据对象传递。

这应该是:

data: {CustomerSearchViewModel.SearchType(), CustomerSearchViewModel.SearchString()}

你也应该把它称为函数,因为它是可观察的。

您还应该在FireBug或其他控制台工具中检查JSON发送服务器的内容。

我希望它有所帮助