Member 13812021 Ответов: 1

Кнопка добавления Jqgrid использует код из edit в контроллере


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

Что я уже пробовал:

Jqgrid
{
    // add option
    zIndex: 100,
    url: "/Admin/CreateCustomer",
    closeOnEscape: true,
    closeAfterAdd: true,
    afterComplete: function (response) {
        if (response.responseJSON) {
            if (response.responseJSON === "Saved Successfully") {
                alert("Saved Successfully");
            }
            else {
                var message = "";
                for (var i = 0; i < response.responseJSON.length; i++) {
                    message += response.responseJSON[i];
                    message += "\n";
                }
            }

        }
    }
},
{
    // edit option
    zIndex: 100,
    url: '/Admin/EditCustomer',
    closeOnEscape: true,
    closeAfterEdit: true,
    recreateForm: true,
    afterComplete: function (response) {
        if (response.responseText) {
            alert(response.responseText);
        }
    }
},

Контроллер
[HttpPost]
public JsonResult CreateCustomer([Bind(Exclude = "ID")] Customer customer)
{
    StringBuilder msg = new StringBuilder();
    try
    {
        if (ModelState.IsValid)
        {
            using (StoreEntities db = new StoreEntities())
            {
                db.CustomerSet.Add(customer);
                db.SaveChanges();
                return Json("Saved Successfully", JsonRequestBehavior.AllowGet);
            }
        }
        else
        {
            var errorList = (from item in ModelState
                             where item.Value.Errors.Any()
                             select item.Value.Errors[0].ErrorMessage).ToList();

            return Json(errorList, JsonRequestBehavior.AllowGet);
        }
    }
    //catch (Exception ex)
    //{
    //    var errormessage = "Error occured: " + ex.Message;
    //    return Json(errormessage, JsonRequestBehavior.AllowGet);
    //}
    catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
    {
        var errorList = new List<string>();

        foreach (var validationErrors in dbEx.EntityValidationErrors)
        {
            foreach (var validationError in validationErrors.ValidationErrors)
            {
                errorList.Add(String.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage));
            }
        }
        return Json(errorList);
    }

}
public string EditCustomer(Customer customer)
{
    string msg;
    try
    {
        if (ModelState.IsValid)
        {
            using (StoreEntities db = new StoreEntities())
            {
                db.Entry(customer).State = EntityState.Modified;
                db.SaveChanges();
                msg = "Saved Successfully";
            }
        }
        else
        {
            msg = "Did not save! Error from Edit Customer ";
        }
    }
    catch (Exception ex)
    {
        msg = "Error occured:" + ex.Message;
    }
    return msg;
}
#endregion

Mike V Baker

"...когда я выбираю в представлении, чтобы добавить строку, она фактически вызывает редактирование в контроллере.."
Возможно ли, что он думает, что вы отредактировали строку, которая теряет фокус? Нажмите кнопку Просмотр, чтобы добавить новую запись. Для этого он должен оставить запись, которая была выбрана при запуске...? Какова ценность клиента в этот момент? Возможно, это null, и все, что вам нужно, - это проверка на выход нулевой сущности.

Member 13812021

Сейчас за столом никого нет. Строка не выбрана. Я помещу запись в таблицу вручную, как и раньше, чтобы убедиться, что она отображается в сетке. Я удалил их с помощью кнопки delete, так что оба они работают. У меня также есть таблица пользователей, которая, кажется, работает, но в ней уже есть записи. Я опубликую свои выводы. Однако если это так, то почему он требует, чтобы в таблице были данные, прежде чем он будет работать?

Ладно, добавил запись вручную. Не совсем понимаю, что происходит. Он все еще использует редактирование, и когда я иду редактировать запись, он сохраняет ее в таблице как новую запись. Чтобы изменить это, используя "добавить" и добавить через редактирование????

Mike V Baker

Код, который вызовет сохранение, не опубликован, поэтому я не уверен, но то, что я думал, может произойти, это то, что сохранение инициируется каким - то событием в сетке. Похоже, что событие запускается для вас, когда в данный момент нет выбранной записи. Таким образом, контроллер вызывается с клиентом == null. Можете ли вы прервать операцию и просмотреть стек вызовов, чтобы увидеть, откуда вызывается обновление?

Member 13812021

Сохранение - это "создать клиента" в разделе контроллера выше. Мне придется взглянуть на него позже. Тот же самый код используется в другой таблице, и он работает, вот что меня смущает. Я подумал, что, возможно, что-то пропустил в копии.

1 Ответов

Рейтинг:
1

Member 13812021

После долгой отладки я обнаружил, что Jqgrid должен работать над индексированием. Не имеет значения, в каком порядке вы размещаете код JavaScript. У меня была правка перед добавлением. переключение его так, чтобы добавление было до редактирования в коде работает. Итак, Jqgrid идет в эту область, я предполагаю, индексируя, в коде. Так как редактирование было где добавить надо было именно с помощью редактирования добавить кнопку.

Я могу сказать, что не согласен с этим методом. Впрочем, не мне об этом говорить. Вы могли бы подумать, что он просто захватит код, где бы и когда бы он ни был нужен.
Урок усвоен.