Могу ли я использовать удаленную проверку MVC 5 для проверки дубликатов значений, но исключить редактируемый элемент? - PullRequest
0 голосов
/ 13 декабря 2018

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

Аннотации:

[Display(Name = "Serial #")]
[Remote("IsSerialAvailable", "Item", ErrorMessage = "Serial # already exists.")]
public string Serial { get; set; }

Контроллеркод:

public ActionResult IsSerialAvailable(string Serial)
    {
        using (db)
        {
            try
            {
                var serial = db.Items.Single(i => i.Serial == Serial);
                return Json(false, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                return Json(true, JsonRequestBehavior.AllowGet);
            }
        }
    }

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Так что вам понадобится 2 вида моделей.Один для создания и один для редактирования.Передавая идентификатор элемента, мы знаем, что это редактирование, а если оно не прошло, мы знаем, что это создание.

public class CreateItemViewModel
{
    [Remote("IsSerialAvailable", "Value")]
    public string Serial { get; set; }
}

public class EditItemViewModel
{
    [Remote("IsSerialAvailable", "Value", AdditionalFields = "ItemId")]
    public string Serial { get; set; }

    public int ItemId { get; set; }
}

    public ActionResult IsSerialAvailable(string serial, int? itemId = null)
    {
        List<int> t = new List<int>();

        Item item;

        if (itemId.HasValue)
        {
            item = db.Items.SingleOrDefault(i => i.Serial == Serial && i.Id != itemId.Value);

        }
        else
        {
            item = db.Items.SingleOrDefault(i => i.Serial == Serial);
        }

        if (item != null)
        {
            return Json(false, JsonRequestBehavior.AllowGet);
        }

        return Json(true, JsonRequestBehavior.AllowGet);
    }
0 голосов
/ 14 декабря 2018

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

public ActionResult IsSerialAvailable(string Serial)
    {
        using (db)
        {
            try
            {
                var actionName = HttpContext.Request.UrlReferrer.Segments[2];
                var serial = db.Items.Single(i => i.Serial == Serial);
                return Json(false, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                return Json(true, JsonRequestBehavior.AllowGet);
            }
        }
    }

Но я бы порекомендовал это пользовательскую проверку

http://dotnetmentors.com/mvc/how-to-do-custom-validation-using-validationattribute-of-aspnet-mvc.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...