Asp MVC 3: измененные значения отправлены на просмотр - PullRequest
0 голосов
/ 06 мая 2011

Насколько я понимаю, ModelBinder может генерировать экземпляры класса из routedata / formdata .

То, что я ищу, это способ манипулировать данными, передаваемыми в представление , прежде чем оно будет использовано представлением.

Каковы возможности?Я что-то упускаю очевидное?

Заранее спасибо!

РЕДАКТИРОВАТЬ
Я не хочу отправлять чистые идентификаторы клиентуно шифровать их (по крайней мере, в редактировать случаи).Поскольку это происходит очень часто, я хочу, чтобы этот шаг был максимально автоматизирован.
Я ищу что-то вроде ModelBinder или Атрибут для присоединения к методу / viewmodel /...

Пример:
GET

public ActionResult Edit(int id)
{
    var vm = new EditArticleViewModel();

    ToViewModel(repository.Get<Article>(id), vm);

    return View(vm); // id is something like 5 and should be encryped before being used by the view
}

Просмотр

@model EditArticleViewModel

<div>
    @Html.HiddenFor(x => x.Id) <!-- x.Id should be encrypted, not just "5" -->
    ...
</div>

LG warappa

Ответы [ 2 ]

1 голос
/ 06 мая 2011

Вы можете сделать что-то с фильтром действий:

public class EncryptIDAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var vm = filterContext.Controller.ViewData.Model as EditArticleViewModel;

        if(vm != null)
        {
            vm.ID = SomeMethodToEncrypt(vm.ID);
        }
    }
}

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

[EncryptID]
public ActionResult Edit(int id)
{
    var vm = new EditArticleViewModel();

    ToViewModel(repository.Get<Article>(id), vm);

    return View(vm);
}

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

Если вы затем захотите применить это к нескольким моделям представлений, вы можете посмотреть на создание пользовательской аннотации данных, которая помечает свойство для шифрования.В вашем фильтре действий вы можете найти любые свойства с этой аннотацией данных и соответствующим образом зашифровать их.

1 голос
/ 06 мая 2011

Вы можете написать собственный вспомогательный метод HiddenFor, который автоматически зашифрует значение:

public static class HiddenExtensions
{
    public static MvcHtmlString HiddenForEncrypted<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> ex)
    {
        var metadata = ModelMetadata.FromLambdaExpression(ex, htmlHelper.ViewData);
        var name = ExpressionHelper.GetExpressionText(ex);
        var value = metadata.Model;
        var encryptedValue = SomeFunctionToEncrypt(value);
        return htmlHelper.Hidden(name, encryptedValue);
    }
}

В качестве альтернативы вы можете использовать помощник Html.Serialize в сборке MVCFutures.это делает это под одеялом.

Так что в основном вы будете писать в своем представлении:

@Html.Serialize("id", Model.Id, SerializationMode.Encrypted)

и в вашем контроллере:

public ActionResult Edit([Deserialize(SerializationMode.Encrypted)]int id)
{
    ...
}
...