Проверка ModelState в MVC

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

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

Благодарность


person Mohammad    schedule 01.02.2020    source источник
comment
Вы используете ASPNET MVC?   -  person Nguyễn Văn Phong    schedule 01.02.2020
comment
@Phong да, я использую MVC   -  person Mohammad    schedule 02.02.2020


Ответы (2)


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

Допустим, у нас есть 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);
        }
    }
}
person Nguyễn Văn Phong    schedule 03.02.2020
comment
@Mohammad Это отвечает на твой вопрос? Дайте мне знать, если вам нужна помощь? Не забудьте поставить мне плюс, мой ответ был вам полезен ^^! - person Nguyễn Văn Phong; 21.03.2021

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

public constructor()
{
  UserId =  ClaimsPrincipal.Current.Identity.GetUserId();
}
person Mohammad    schedule 17.02.2020