Вопрос по asp.net-mvc-3, validation, asp.net-mvc – MVC Model Привязка к коллекции, где коллекция не начинается с индекса 0

12

Я пытаюсь выполнить удаленную проверку свойства элемента в коллекции. Проверка работает нормально для первого элемента коллекции. Http-запрос к методу проверки выглядит так:

/Validation/IsImeiAvailable?ImeiGadgets[0].ImeiNumber=123456789012345

Однако в отношении второго элемента, где URL-адрес выглядит следующим образом, проверка не работает

/Validation/IsImeiAvailable?ImeiGadgets[1].ImeiNumber=123456789012345

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

Мой метод проверки имеет подпись, как показано ниже:

public JsonResult IsImeiAvailable([Bind(Prefix = "ImeiGadgets")] Models.ViewModels.ImeiGadget[] imeiGadget)

Поскольку я передаю элемент в коллекцию, я должен связать вот так, но то, что я действительно передаю, - это всего лишь одно значение.

Есть ли в любом случае я могу иметь дело с этим, кроме как просто связать его в виде простой старой строки запроса.

Спасибо

Изменить: это быстрое решение для получения переменной Imei, но я бы лучше использовал привязку модели:

string imeiNumber = Request.Url.AbsoluteUri.Substring(Request.Url.AbsoluteUri.IndexOf("=")+1);

Изменить: Вот мой класс ImeiGadget:

public class ImeiGadget
{
    public int Id { get; set; }

    [Remote("IsImeiAvailable", "Validation")]
    [Required(ErrorMessage = "Please provide the IMEI Number for your Phone")]
    [RegularExpression(@"(\D*\d){15,17}", ErrorMessage = "An IMEI number must contain between 15 & 17 digits")]
    public string ImeiNumber { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }
}
Я отправляю сообщение с помощью Ajax-запроса, который обрабатывается функцией удаленной проверки MVC3 FloatLeft
Это aspx? Если так, пожалуйста, повторно Ja͢ck
Публикуете ли вы через Ajax-запрос? Если так, можем ли мы увидеть этот код? У меня есть догадка :-) CD Smith
Это вопрос MVC3. Я пометил это неправильно? FloatLeft
исправил пометку - предположил aspnet-mvc, когда увидел атрибут [Bind] Josh E

Ваш Ответ

4   ответа
0

many places и вы контролируетеIsImeiAvailable метод проверки тогдаI think создаваяcustom model binder являетсяover-head.

Почему бы вам не попробовать простое решение, подобное этому,

// need little optimization?
public JsonResult IsImeiAvailable(string imeiNumber)
{
  var qParam = Request.QueryString.Keys
     .Cast<string>().FirstOrDefault(a => a.EndsWith("ImeiNumber"));

  return Json(!string.IsNullOrEmpty(imeiNumber ?? Request.QueryString[qParam]), JsonRequestBehavior.AllowGet);
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded FloatLeft
Error: User Rate Limit Exceeded FloatLeft
0

но у вас есть непоследовательный индекс, вы можете вместо этого рассмотреть возможность привязки к словарю http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx

Если вы публикуете только один элемент или используете ссылку GET, вам следует изменить

/Validation/IsImeiAvailable?ImeiNumber=123456789012345

а также

public JsonResult IsImeiAvailable(string imeiNumber)
Error: User Rate Limit Exceeded FloatLeft
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededimeiNumberError: User Rate Limit ExceededstringError: User Rate Limit Exceededint?
8

public class ImeiNumberModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var modelName = bindingContext.ModelName;
        var request = controllerContext.HttpContext.Request;
        var paramName = request
            .Params
            .Keys
            .Cast<string>()
            .FirstOrDefault(
                x => x.EndsWith(modelName, StringComparison.OrdinalIgnoreCase)
            );

        if (!string.IsNullOrEmpty(paramName))
        {
            return bindingContext
                .ValueProvider
                .GetValue(request[paramName])
                .AttemptedValue;
        }

        return null;
    }
}

и затем примените его к действию контроллера:

public ActionResult IsImeiAvailable(
    [ModelBinder(typeof(ImeiNumberModelBinder))] string imeiNumber
)
{
    return Json(!string.IsNullOrEmpty(imeiNumber), JsonRequestBehavior.AllowGet);
}

ТеперьImeiGadgets[xxx] часть будет игнорироваться из строки запроса.

Error: User Rate Limit Exceeded FloatLeft
0

тогда ваш метод действия должен принимать только скалярный (однозначный) параметр, а не коллекцию. Ваш URL будет выглядеть следующим образом (при условии, что таблица маршрутизации по умолчанию для {controller} / {action} / {id}:

/Validation/IsImeiAvailable?ImeiNumber=123456789012345

соответствующая сигнатура метода действия может выглядеть так:

/* note that the param name has to matchthe prop name being validated */
public ActionResult IsImeiAvailable(int ImeiNumber)

РЕДАКТИРОВАТЬ: который вы могли бы затем использовать для поиска, доступен ли этот конкретный идентификатор.

если вы хотите изменить имя параметра, вы можете изменить таблицу маршрутизации, но это другая тема.

Короче говоря, если вы хотите сделать валидациюcollection изImeiGadget, вы ПОЛУЧАЕТЕ или ПОСТАВЛЯЕТЕ эту полную коллекцию. Для единственного значения не имеет особого смысла отправлять или ожидать целую коллекцию.

ОБНОВИТЬ: Основываясь на новой информации, я бы посмотрел, где находится атрибут удаленной проверки. Этоsounds как это может быть помещено на что-то вродеIEnumerable<IMEiGadgets>, как это:

[Remote("IsImeiAvailable", "Validation", "'ImeiNumber' is invalid"]
public IEnumerable<ImeiGadget> ImeiGadgets { get; set;}

Можно ли переместить этот атрибут и изменить его, чтобы онImeiGadget вместо класса, чтобы быть чем-то вроде этого?

[Remote("IsImeiAvailable", "Validation", "'ImeiNumber is invalid"]
public int ImeiNumber { get; set;}

Теоретически вам не нужно ничего менять в своих HTML-шаблонах или скриптах, чтобы это работало, если вы также вносите изменения, предложенные в моем ответе выше. Теоретически.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded FloatLeft
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded/Validation/IsImeiAvailable?ImeiGadgets[1].ImeiNumber=123456789012345

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