MVC 中的模型状态验证
ModelState Validation in MVC
class 有一个 属性 UserId
哪种类型的 ApplicationUser
是必需的,当然我们不能将它从视图传递到控制器,因为安全原因。
现在,当控制器检查模型状态时,模型不处于正确状态,因为没有 UserId 值,它 returns 返回视图,如果我使用视图模型 class 有 50 多个属性并将视图模型中的值分配给 class 然后保存它非常繁琐且难以保存编辑等等,从这个问题中得出的任何建议
谢谢
您可以使用Action Filters attribute来自动绑定属性。
假设我们有 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);
}
}
}
总之感谢合作解决这个问题
我发现从 class 到 return 一个 UserId 的最简单方法,在 class 构造函数
中只需要一行代码]
public constructor()
{
UserId = ClaimsPrincipal.Current.Identity.GetUserId();
}
class 有一个 属性 UserId
哪种类型的 ApplicationUser
是必需的,当然我们不能将它从视图传递到控制器,因为安全原因。
现在,当控制器检查模型状态时,模型不处于正确状态,因为没有 UserId 值,它 returns 返回视图,如果我使用视图模型 class 有 50 多个属性并将视图模型中的值分配给 class 然后保存它非常繁琐且难以保存编辑等等,从这个问题中得出的任何建议
谢谢
您可以使用Action Filters attribute来自动绑定属性。
假设我们有 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);
}
}
}
总之感谢合作解决这个问题 我发现从 class 到 return 一个 UserId 的最简单方法,在 class 构造函数
中只需要一行代码]public constructor()
{
UserId = ClaimsPrincipal.Current.Identity.GetUserId();
}