【问题标题】:ModelState Validation in MVCMVC 中的模型状态验证
【发布时间】:2020-05-17 20:01:21
【问题描述】:

该类有一个属性UserIdApplicationUser的类型和它是必需的,当然出于安全原因我们不能将它从视图传递给控制器​​。

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

谢谢

【问题讨论】:

  • 你在使用ASPNET MVC吗?
  • @Phong 是的,我正在使用 MVC

标签: asp.net-mvc entity-framework modelstate actionfilterattribute


【解决方案1】:

您可以使用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);
        }
    }
}

【讨论】:

  • @Mohammad 这能回答你的问题吗?让我知道您是否需要任何帮助?不要忘记给我一个upvote我的回答对你有用^^!
【解决方案2】:

无论如何感谢合作解决这个问题 我发现从类中返回 UserId 的最简单方法,在类构造函数中只需要一行代码

public constructor()
{
  UserId =  ClaimsPrincipal.Current.Identity.GetUserId();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    相关资源
    最近更新 更多