Почему значение скрытого поля не получается корректно на стороне контроллера при отправке формы в MVC? [Дубликат]

String.prototype.reverse=function(){return this.split("").reverse().join("");}

или

String.prototype.reverse = function() {
    var s = "";
    var i = this.length;
    while (i>0) {
        s += this.substring(i-1,i);
        i--;
    }
    return s;
}
9
задан VinnyG 29 June 2010 в 18:36
поделиться

5 ответов

I Используйте следующие

public class ObjectIdModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        string value = controllerContext.RouteData.Values[bindingContext.ModelName] as string;
        if (String.IsNullOrEmpty(value)) {
            return ObjectId.Empty;
        }
        return new ObjectId(value);
    }
}

и

protected void Application_Start()
    {
        ......

        ModelBinders.Binders.Add(typeof(ObjectId), new ObjectIdModelBinder()); 
    }

почти забытые, сделайте URL-адреса из ObjectId.ToString()

14
ответ дан Sherlock 19 August 2018 в 16:55
поделиться
  • 1
    Это решение не работает, когда значения передаются в форме. См. Мой ответ для решения, которое работает независимо от того, как передаются значения. (Возможно, стоит также отметить, какой драйвер C # MongoDB был для них синтаксисом). – Ian Mercer 4 December 2010 в 08:10
  • 2
    Исходный вопрос был в контексте ASP.NET MVC и стандартного кода, который позволил бы контроллеру разбора ObjectId из url. – Sherlock 13 December 2010 в 20:51

Используйте настраиваемое связующее устройство, подобное этому ... (работает против официального драйвера C # MongoDB)

protected void Application_Start()
{
    ...
    ModelBinders.Binders.Add(typeof(ObjectId), new ObjectIdModelBinder()); 
}

public class ObjectIdModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (result == null)
        {
            return ObjectId.Empty;
        }
        return ObjectId.Parse((string)result.ConvertTo(typeof(string)));
    }
}
15
ответ дан Ian Mercer 19 August 2018 в 16:55
поделиться
  • 1
    Это порождает исключение, когда параметр возится. Я думаю, что использование TryParse и возвращение ObjectId.Empty, когда оно неверно, - лучший способ его обработки. – phloopy 23 October 2012 в 16:16
  • 2
    @IanMercer Это не будет, если ObjectId имеет значение NULL – Parth Savadiya 14 May 2018 в 08:37

Знаете ли вы, что вы можете использовать атрибут [MongoIdentifier], чтобы заставить любое свойство действовать как уникальный ключ?

Я решал эту проблему, заимствуя технику из WordPress, представленный свойством «url slug» и украшающим это свойство [MongoIdentifier].

Итак, если бы у меня был человек по имени Джонни Уокер, я бы создал слизню «johnny-walker». Вам просто нужно убедиться, что эти URL-адреса остаются уникальными, и вы получаете чистые URL-адреса без уродливых идентификаторов объектов.

0
ответ дан jfar 19 August 2018 в 16:55
поделиться
  • 1
    Да, я знаю это, потому что только для администрации мне не нужны чистые URL-адреса. На данный момент я добавил свойство IdValue, которое отображает значение ObjectId в виде строки, и когда мне нужно получить данные, которые я просто делаю. Единственный (новый ObjectId (id)) не уверен, что это лучший способ, но он отлично работает ... – VinnyG 29 June 2010 в 21:00

Для веб-API вы можете добавить параметр привязки обязательных параметров в WebApiConfig:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        //...
        config.ParameterBindingRules.Insert(0, GetCustomParameterBinding);
        //...
    }

    public static HttpParameterBinding GetCustomParameterBinding(HttpParameterDescriptor descriptor)
    {
        if (descriptor.ParameterType == typeof(ObjectId))
        {
            return new ObjectIdParameterBinding(descriptor);
        }
        // any other types, let the default parameter binding handle
        return null;
    }

    public class ObjectIdParameterBinding : HttpParameterBinding
    {
        public ObjectIdParameterBinding(HttpParameterDescriptor desc)
            : base(desc)
        {
        }

        public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken)
        {
            try
            {
                SetValue(actionContext, new ObjectId(actionContext.ControllerContext.RouteData.Values[Descriptor.ParameterName] as string));
                return Task.CompletedTask;
            }
            catch (FormatException)
            {
                throw new BadRequestException("Invalid ObjectId format");
            }
        }
    }
}

И использовать его без каких-либо дополнительных атрибутов в контроллере:

 [Route("{id}")]
 public IHttpActionResult Get(ObjectId id)
0
ответ дан razon 19 August 2018 в 16:55
поделиться
Другие вопросы по тегам:

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