Проверка ModelState в MVC - PullRequest
       38

Проверка ModelState в MVC

0 голосов
/ 01 февраля 2020

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

Теперь, когда контроллер проверяет состояние модели модель не в правильном состоянии, потому что отсутствует UserId Value, и она возвращает представление назад, если я использую модель представления, класс имеет более 50 свойств и присваивает значения из модели представления классу, а затем сохраняет его это очень утомительно и трудно сделать это для сохранения редактирования и так далее, любой совет, чтобы выйти из этой проблемы

спасибо

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

В любом случае, спасибо за сотрудничество в решении этой проблемы. Я нашел самый простой способ вернуть UserId из класса, внутри конструктора класса требуется только одна строка кода

public constructor()
{
  UserId =  ClaimsPrincipal.Current.Identity.GetUserId();
}
0 голосов
/ 03 февраля 2020

Вы можете использовать Атрибут Фильтры действий до Свойство автоматической привязки .

Допустим, у нас есть UserSettingMetaModel с UserId свойство.

public interface IAutoBindingUserId
{
    int UserId { get; set; }
}

public class UserSettingMetaModel : IAutoBindingUserId
{
    public int Id { get; set; }

    [Required]
    public int UserId { get; set; }

    // The rest of properties
}

В UserSetting контроллер, у нас есть

    [HttpPost]
    [AutoBindProperty]
    public JsonResult Add(UserSettingMetaModel metaModel)
    {
        if (ModelState.IsValid)
        {
            // do something
        }
    }

За смыслом AutoBindProperty Атрибут

[AttributeUsage(AttributeTargets.Method)]
public sealed class AutoBindPropertyAttribute : ActionFilterAttribute
{

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var actionParams = filterContext.ActionParameters.Values.FirstOrDefault();

        Bind<IAutoBindingUserId>(model => model.UserId = 123, actionParams);
        // Assuming that you know the way get userId value here.
    }

    private static void Bind<T>(Action<T> doBinding, object actionParams) where T : class
    {
        if (actionParams is T model)
        {
            doBinding(model);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...