ASP.NET MVC Модель представления по умолчанию Привязка файлов cookie к пользовательским объектам - PullRequest
3 голосов
/ 12 сентября 2010

Поддерживает ли ASP.NET MVC 2 связывание моделей представления по умолчанию привязку многозначного cookie к пользовательскому объекту? Прежде чем писать собственный поставщик значений, я хотел бы убедиться, что эта функциональность еще не существует.

Итак, с учетом действия вроде:

public ActionResult SomeAction(CustomObject foo)

где CustomObject - это что-то вроде:

public class CustomObject
{
    public string Name { get; set; }
    public int Rank { get; set; }
}

и файл cookie, который является частью запроса, например:

foo=Name=John&Rank=10

Могу ли я получить привязку модели представления по умолчанию для сопоставления файла cookie с параметром с некоторыми хитрыми изменениями в именовании значений файла cookie или cookie, таких как отправка сообщений "foo.Name=John" и "foo.Rank=10"?

Ответы [ 2 ]

3 голосов
/ 12 сентября 2010

Ну, есть один способ сделать это - реализовать IModelBinder

public class CustomObjectModelBinder : IModelBinder {

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
        HttpCookie c = controllerContext.HttpContext.Request.Cookies["foo"]

        CustomObject value = new CustomObject() {
            foo.Name = c.Values["Name"],
            foo.Rank = c.Values["Rank"]
        }

        return CustomObject
    }

}

Затем просто добавьте это в Application_Start ()

ModelBinders.Binders.Add(typeof(CustomObject), new CustomObjectModelBinder());

Вы можете добавить объект cookie к любому действию, насколько я знаю, и он попытается связать его для вас

0 голосов
/ 13 сентября 2010

В конце концов я создал что-то для этого. Основываясь на работе, опубликованной Мехди Голчин , я создал провайдера значений, который позволяет этому типу привязки происходить.

Для тех, кто заинтересован, ниже приведены пользовательские изменения, внесенные мной в работу Мехди, о которой говорилось выше. Смотрите ссылку для получения полной информации о реализации. Это не поддерживает привязку к вложенным объектам (например, Foo.Cell.X), потому что мне не нужен этот уровень сложности, но это будет возможно реализовать с небольшим количеством рекурсии.

protected virtual bool ContainsPrefix(string prefix)
{
    try
    {
        var parts = prefix.Split(new char[] { '.' }, 2, StringSplitOptions.RemoveEmptyEntries);

        switch (parts.Length)
        {
            case 0:
                return false;
            case 1:
                return this._context.HttpContext.Request.Cookies.AllKeys.Contains(parts[0]);
            default:
                var cookie = this._context.HttpContext.Request.Cookies[parts[0]];
                if (cookie == null) { return false; }
                return cookie.Values.AllKeys.Contains(parts[1]);
        }
    }
    catch (Exception ex)
    {
        ExceptionPolicy.HandleException(ex, "Controller Policy");
        return false;
    }
}

protected virtual ValueProviderResult GetValue(string key)
{
    try
    {
        var parts = key.Split(new char[] { '.' }, 2, StringSplitOptions.RemoveEmptyEntries);

        if (parts.Length < 2) { return null; }

        var cookie = this._context.HttpContext.Request.Cookies[parts[0]];

        if (cookie == null) { return null; }

        var value = cookie.Values[parts[1]];

        if (value == null) { return null; }

        return new ValueProviderResult(value, value, CultureInfo.CurrentCulture);
    }
    catch (Exception ex)
    {
        ExceptionPolicy.HandleException(ex, "Controller Policy");
        return null;
    }
}
...