MVC 中的模型状态验证

ModelState Validation in MVC

class 有一个 属性 UserId 哪种类型的 ApplicationUser 是必需的,当然我们不能将它从视图传递到控制器,因为安全原因。

现在,当控制器检查模型状态时,模型不处于正确状态,因为没有 UserId 值,它 returns 返回视图,如果我使用视图模型 class 有 50 多个属性并将视图模型中的值分配给 class 然后保存它非常繁琐且难以保存编辑等等,从这个问题中得出的任何建议

谢谢

您可以使用Action Filters attribute自动绑定属性

假设我们有 UserSettingMetaModelUserId 属性.

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);
        }
    }
}

总之感谢合作解决这个问题 我发现从 class 到 return 一个 UserId 的最简单方法,在 class 构造函数

中只需要一行代码]
public constructor()
{
  UserId =  ClaimsPrincipal.Current.Identity.GetUserId();
}