Пользовательская привязка в ASP.NET MVC - изменение поведения привязки для одного поля - PullRequest
2 голосов
/ 23 мая 2009

В моей базе данных есть поле с плавающей запятой двойной точности, которое хранит секунды после полуночи. У меня есть код в C #, который может преобразовать это число в форму HH: MM: SS.ffffff, где f это доли секунды. У меня также есть код, который может разобрать это обратно в двойной.

Что я хотел бы сделать, так это изменить объект связующего элемента в ASP.NET MVC так, чтобы он использовал методы MY parsing и ToString () вместо тех, которые он обычно использовал бы из типа double, без необходимости писать полный текст. пользовательский переплет.

Могу ли я написать пару методов расширения в c # или использовать несколько удачно расположенных атрибутов, чтобы объект связывателя узнал о моих методах синтаксического анализа и ToString ()?

Вот еще несколько уточнений.

если я предоставлю для представления такую ​​модель, как класс Linq to SQL, MVC может автоматически подключить мои поля к базовой модели данных, при условии, что я использую те же имена для элементов управления в моем представлении, что и в моем модель данных. Если я отправлю свое представление MVC обратно в метод контроллера, я могу записать изменения пользователя обратно в базу данных, вызвав метод UpdateModel в моем классе Controller. Мне не нужно беспокоиться о подключении моих конкретных полей из FormCollection к моему классу данных Linq to SQL, потому что механизм связывания уже сделал это для меня.

Я предполагаю, что для того, чтобы механизм связывания сработал эту магию с обычным числовым двойником, он должен сначала проанализировать входные данные пользователя (возможно, вызвав double.parse) и передать его классу Linq to SQL так что он может обновить базу данных.

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

Ответы [ 2 ]

1 голос
/ 23 мая 2009

Это наивный, быстрый и грязный пример, но если вы решили пойти по пути связывания моделей, попробуйте что-то вроде:

// This goes in global.asax
ControllerBuilder.Current.SetControllerFactory(new ControllerFactory());
ModelBinders.Binders.Add(typeof(CustomDateType), new CustomDateBinder());

......

public class CustomDateType
{
    public CustomDateType(string value)
    {
    }

    public string GetText()
    {
        // I do fancy stuff
        throw new NotImplementedException();
    }
    public decimal? GetValue()
    {
        // I do fancy stuff
        throw new NotImplementedException();
    }
}

public class CustomDateBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        try
        {
            string doubleDateValue = GetAttemptedValue(bindingContext);

            if (doubleDateValue == "")
            {
                return null;
            }

            return new CustomDateType(doubleDateValue);
        }
        catch (Exception ex)
        {
            string message = string.Format("Unable to locate a valid value for query string parameter '{0}'",
                                       bindingContext.ModelName);
            throw new ApplicationException(message, ex);
        }
    }

    private static string GetAttemptedValue(ModelBindingContext bindingContext)
    {
       ValueProviderResult value = bindingContext.ValueProvider[bindingContext.ModelName];
        return value == null ? string.Empty : value.AttemptedValue;
    }
 }
0 голосов
/ 23 мая 2009

Обязательно ли иметь имя .ToString()? Это легко, если, например, .ToCustomString() приемлемо:

public static class DoubleExtensions
{
    public static string ToCustomString(this double d)
    {
        return "my own";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...