ASPNET MVC - Почему ModelState. Ложь IsValid “X поле требуется”, когда то поле действительно имеет значение?

У меня есть модель как это:

public PurchaseOrder 
{
    [Required] [StringLength(15)]
    public virtual string OrderNumber {get;set;}
    // etc.        
}

Когда я размещаю заказ от представления (использующий $ .post, не вводит type=submit), это переходит к моему классу контроллера:

public class PurchaseOrderController
{
    public JsonResult Save(PurchaseOrder order)
    {
        // TryUpdateModel(order); // commented out since modelstate.isvalid remains false anyway
        if (ModelState.IsValid)
        {
            // its never valid 
        }
    }
}

ModelState. IsValid всегда возвращает false с ошибкой: "Поле Order Number требуется". Но существует значение в этом поле (?? почему)

Почему это сказало бы, что "значение требуется", когда это действительно имеет значение? Я пропустил что-то? Это из-за $ .post вместо отправления? Что я могу сделать?

Это - то, на что похож отладчик:

сопроводительный текст http://www.freeimagehosting.net/uploads/f734f3d95d.png

Править: Дополнительная информация....

Я действительно думаю, что по некоторым причинам образцовой привязки не происходит. Когда я пробую этот код, найденный здесь:)

if (!ModelState.IsValid)
{
    ModelState.Clear();
    ModelMetadata modelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => order, order.GetType());
    ModelValidator compositeValidator = ModelValidator.GetModelValidator(modelMetadata, base.ControllerContext);

    foreach (ModelValidationResult result in compositeValidator.Validate(null))
    {
        this.ModelState.AddModelError(result.MemberName, result.Message);
    }
}

Затем ModelState. IsValid = верный. compositeValidator. Проверьте (), возвращает 0 ошибок. Я думаю, что это указывает, что модель не была связана, но я все еще не знаю почему.

Метод контроллера на самом деле похож на это (я пропустил фильтр, первоначально пишущий этот вопрос),

[JsonFilter(Param = "order", JsonDataType = typeof(PurchaseOrder))] 
public JsonResult Save(PurchaseOrder order) { //  etc ... }

И JsonFilter делает это для извлечения ПОСТЕПЕННО из json отправило данные:

filterContext.ActionParameters[Param] 
    = jsSerializer.Deserialize(inputContent, JsonDataType);

Я поместил точку останова на эту строку, и порядок допустим плюс порядок. OrderNumber имеет правильное значение.

Так все еще неразрешенный, но надо надеяться эта дополнительная информация поможет с нахождением решения

6
задан JK. 14 May 2010 в 02:37
поделиться

3 ответа

Ну, я «решил» это, но я не совсем понимаю, почему внесенные мной изменения помогли.

Мне пришлось сделать три вещи:

  1. Удалить фильтр json (фильтры не привязываются)

  2. Измените contentType на application / json

    $. AjaxSetup ({ contentType: "application / json; charset = utf-8" });

  3. Используйте фьючерсы MVC для загрузки Microsoft.Mvc.dll, как описано здесь: http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net -mvc-действие-метод-аргумент.aspx . Где сказано, чтобы добавить это в Application_Start () в Global.asax.cs:

    ValueProviderFactories.Factories.Add (new JsonValueProviderFactory ());

Теперь я не знаю точно, почему это сработало, но оно сработало.

К сожалению, это имело отрицательный побочный эффект: тип содержимого применяется ко всем $ .get () и $.post () и сломали все мои jqgrids - они, кажется, работают, только если тип содержимого является значением по умолчанию application / x-www-form-urlencoded

Итак, я задал 2 следующих вопроса:

  1. Is можно ли установить тип контента в вызове $ .post ()? Тогда мне не нужно было бы устанавливать его глобально Jquery - Как заставить $ .post () использовать contentType = application / json?

  2. Можно ли заставить работать jqrid, если тип содержимого - application / json? JQuery - Как заставить $ .post () использовать contentType = application / json?

1
ответ дан 17 December 2019 в 18:11
поделиться

Вы уверены, что ошибка исходит из поля OrderNumber?

Кажется странным, что В сообщении об ошибке указан номер заказа в 2 слова.

Попробуйте изменить имя поля или удалить обязательный тег, чтобы убедиться, что именно здесь возникла ошибка.

1
ответ дан 17 December 2019 в 18:11
поделиться

Есть вероятность, что ваше сообщение jQuery отправляется неправильно обратно в контроллер. Возможно, вы публикуете только номер заказа, а не объект, который точно представляет модель. Мне нужно увидеть ваш javascript, чтобы быть абсолютно уверенным.

Правильный способ публикации в этом методе: (при условии, что номер вашего заказа хранится в переменной javascript с именем "orderNumber":

$.post([url to method], 
       { order: { OrderNumber: orderNumber } }, 
       function(json) {
       //Insert code for actions to take after AJAX post returns.
       },
       'json');

Если это так, то следующий шаг, который я предприму, - это перепроверить что javascript действительно фиксирует значение номера вашего заказа и публикует его как часть запроса. Быстрое изучение с помощью Firebug должно помочь вам определить, происходит это или нет.

1
ответ дан 17 December 2019 в 18:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: