Передача параметров в связыватель модели по параметру действия - PullRequest
2 голосов
/ 08 января 2009

Я хочу использовать привязку модели, которую я сделал непосредственно для параметра метода действия. Такие как:

public ActionResult MyAction([ModelBinder(typeof(MyBinder))] string param1)

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

public ActionResult MyAction([MyBinder("mystring")] string param1)

Возможно ли это?

Ответы [ 3 ]

2 голосов
/ 08 января 2009

Нет, вы не можете передавать параметры через объявление атрибута. Если вы посмотрите на исходный код ModelBinderAttribute, вы увидите, что его конструктор принимает только аргумент типа, что у него нет других свойств и что это закрытый класс. Так что эта дорога тупиковая.

Единственный способ получить информацию в ModelBinder, о которой я знаю, - это сама FormCollection.

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

0 голосов
/ 26 июня 2018

Да, это возможно. Вам следует создать класс создания из System.Web.Mvc.CustomModelBinder и переопределить метод GetBinder. Например, здесь реализация, которая принимает в дополнение к Type объекту, а также массив объектов для параметров конструктора связывателя модели:

public sealed class MyModelBinderAttribute : CustomModelBinderAttribute
{
    /// <summary>
    /// Gets or sets the type of the binder.
    /// </summary>
    /// <returns>The type of the binder.</returns>
    public Type BinderType { get; }
    /// <summary>
    /// Gets or sets the parameters for the model binder constructor.
    /// </summary>
    public object[] BinderParameters { get; }

    /// <summary>
    /// Initializes a new instance of the <see cref="T:System.Web.Mvc.ModelBinderAttribute" /> class.
    /// </summary>
    /// <param name="binderType">The type of the binder.</param>
    /// <param name="binderParameters">The parameters for the model binder constructor.</param>
    /// <exception cref="T:System.ArgumentNullException">The <paramref name="binderType" /> parameter is null.</exception>
    public MyModelBinderAttribute(Type binderType, params object[] binderParameters)
    {
        if (null == binderType)
        {
            throw new ArgumentNullException(nameof(binderType));
        }

        if (!typeof(IModelBinder).IsAssignableFrom(binderType))
        {
            throw new ArgumentException(string.Format(CultureInfo.CurrentCulture,
                "An error occurred when trying to create the IModelBinder '{0}'. Make sure that the binder has a public parameterless constructor.",
                binderType.FullName), nameof(binderType));
        }
        this.BinderType = binderType;
        this.BinderParameters = binderParameters ?? throw new ArgumentNullException(nameof(binderParameters));
    }

    /// <summary>Retrieves an instance of the model binder.</summary>
    /// <returns>A reference to an object that implements the <see cref="T:System.Web.Mvc.IModelBinder" /> interface.</returns>
    /// <exception cref="T:System.InvalidOperationException">An error occurred while an instance of the model binder was being created.</exception>
    public override IModelBinder GetBinder()
    {
        IModelBinder modelBinder;
        try
        {
            modelBinder = (IModelBinder)Activator.CreateInstance(this.BinderType, this.BinderParameters);
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,
                "An error occurred when trying to create the IModelBinder '{0}'. Make sure that the binder has a public parameterless constructor.",
                this.BinderType.FullName), ex);
        }
        return modelBinder;
    }
}
0 голосов
/ 07 марта 2012

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

Интересно, вы могли бы использовать ControllerContext, переданный в Binder, и предоставить сервис / свойство или куда-нибудь через свойство?

Просто мысль, я собираюсь попробовать это сейчас, и я передам обратно

Rich

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