Проблема в вызове веб-API Post Post метод из jquery

0

Я вызываю метод api post из jquery ajax. Он работает нормально, когда я передаю объект только с строковыми свойствами, но показывая нулевое значение при передаче всех его свойств, включая строки, int и bool,

Класс Entity

  public partial class Pract_Product
{
    public int Id { get; set; }

    public string Category { get; set; }

    public string Name { get; set; }

    public Nullable<decimal> Price { get; set; }

    public Nullable<double> Weight { get; set; }

    public Nullable<bool> isactive { get; set; }
}

JS

    var Pract_Product = new Object();
    //    Pract_Product.Id =  $('#Id').val(),
        Pract_Product.Category = $('#Category').val(),
        Pract_Product.Name = $('#Name').val(),
    //    Pract_Product.Price = $('#Price').val(),
     //   Pract_Product.Weight = $('#Weight').val(),
     //   Pract_Product.isactive = "1"

        alert('tested');
        $.ajax({
            url: 'http://localhost:4135/api/ProdService',
            type: 'POST',
            dataType: "json",
            data: Pract_Product,
            async: false,
            headers: { 'Password': pwd },
            success: function (data) {
                alert('success');
            },
            error: function (x, y, z) {
                debugger;
                alert(x + '\n' + y + '\n' + z);
            }
        });

Действие контроллера API

// POST api/ProdService
    public HttpResponseMessage PostPract_Product(Pract_Product product)
    {
   //-- code for inserting object
   }

В приведенном выше примере я прокомментировал свойства с типом данных, другие, что строка для объекта, тогда этот вызов работает нормально и дает правильные строковые значения как свойства строки, так и null для других свойств. Когда я передаю все значения, это дает мне внутреннюю ошибку сервера. Я также пытался использовать data:JSON.stringify(Pract_Product) но без разрешения. Пожалуйста, помогите мне.

  • 0
    Есть ли где-нибудь трассировка стека исключений? Я плохо знаю ASP.NET, но заботится ли фреймворк о преобразовании URL-параметров в «десятичные» или «логические» представления в свойствах? Если нет, то лучше рассмотреть все как строку и выполнить соответствующее преобразование внутри. Или вы можете переопределить set / get для каждого свойства, чтобы убедиться, что вы правильно проанализировали значение.
  • 0
    Да, верно, я думаю, типы объектов не совпадают с обоих концов
Показать ещё 8 комментариев
Теги:
asp.net-mvc
asp.net-web-api
asp.net-mvc-4

2 ответа

0

Проблема заключается в сериализации десятичных переменных, которые имеют 0 в десятичной части для JSON.

Таким образом, 1.23 будет правильно сериализован до 1,23, но 1,00 будет сериализован до 1.

Чтобы решить эту проблему, вы можете:

- Преобразование десятичных знаков в фиксированный формат:

Pract_Product.Price = $('#Price').val().toFixed(2); (Где 2 - количество цифр в десятичной части).

Документация для JavaScript toFixed()

- Создайте собственное связующее устройство (как это рекомендуется здесь):

public class DecimalModelBinder : IModelBinder {
    public object BindModel(ControllerContext controllerContext, 
                                    ModelBindingContext bindingContext) {
        ValueProviderResult valueResult = bindingContext.ValueProvider
            .GetValue(bindingContext.ModelName);
        ModelState modelState = new ModelState { Value = valueResult };
        object actualValue = null;
        try {
            actualValue = Convert.ToDecimal(valueResult.AttemptedValue, 
                CultureInfo.CurrentCulture);
        }
        catch (FormatException e) {
            modelState.Errors.Add(e);
        }

        bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
        return actualValue;
    }
}

И зарегистрируйте его в Application_Start из Global.asax:

protected void Application_Start() {
    ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());   
}

Также я бы рекомендовал вам добавить contentType: 'application/json; charset=utf-8' contentType: 'application/json; charset=utf-8' в ваш запрос ajax.

Используемые статьи: JSON и.NET Decimals, ASP.NET MVC3 JSON с десятичной привязкой.

0

Попробуйте изменить свою подпись ASP.NET, чтобы принять объект следующим образом:

public HttpResponseMessage PostPract_Product(object model)
{
    // now convert from object to Pract_Product
    var jsonString = model.ToString();
    Pract_Product result = JsonConvert.DeserializeObject<Pract_Product>(jsonString);
    //-- code for inserting object
}
  • 0
    Я пробовал это, но jsonString не содержит данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню