Я вызываю метод 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 в десятичной части для 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 с десятичной привязкой.
Попробуйте изменить свою подпись 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
}
jsonString
не содержит данных.