为后端c# MVC中的post对象添加值

本文关键字:对象 添加 post 中的 后端 MVC | 更新日期: 2023-09-27 18:18:11

我有一个这样的问题,是否有可能在MVC中添加一个值到张贴对象

public ActionResult Create([Bind(Include = "ID = 1", LastName, FirstMidName, EnrollmentDate")] Student student)
{
    try {
        if (ModelState.IsValid)
        {
            db.Students.Add(student);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    }
}

比如ID = 1,当然这是行不通的。我想添加关于模型的额外信息,在它开始表单验证过程之前。我有像TryValidateModel(my updated model)这样的选项,但在这种情况下,我要验证我的对象两次,或者其他选项是在前端添加隐藏类型。我想这样做的原因是,我的模型有CRUD操作,而验证在每种类型的CRUD上是不同的。例如,在更新期间,它不会检查值是否存在于数据库中等。

我想出了一个解决方案,使用HTTP方法名称,如HTTPPUT HTTPDELETE,用于验证,它将是REST解决方案。谢谢大家的帮助。

为后端c# MVC中的post对象添加值

修改ASP.net MVC Actions输入的最佳位置是ModelBinder,创建您的自定义通用ModelBinder并从默认的MVC DefaultModelBinder继承,并在BindModel方法覆盖中添加您想要的信息。

这是一个可以扩展的例子,以实现您想要的:

public class CustomModelBinderBinder : DefaultModelBinder
{
    private readonly Dictionary<string, object> _extraProperties;
   public CustomModelBinderBinder(Dictionary<string, object> extraProperties)
   {
        _extraProperties = extraProperties;
   }
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var model = bindingContext.Model;
        var modelType = model.GetType();
        var modelProperties = modelType.GetProperties(BindingFlags.Public);
        foreach (var property in _extraProperties)
        {
           var matchingProperty = modelType.GetProperties().FirstOrDefault(p => p.Name == property.Key);
            if (matchingProperty != null)
            {
                try
                {           
                    matchingProperty.SetValue(model, property.Value);
                }
                catch (Exception ex)
                {
                    // what happens when we fail to set this value?
                    // possibly due to type mismatch, or readonly property
                    throw;
                }
            }
        }
    }
}

在该示例中,要扩展的属性列表出现在构造函数动态参数中,然后对Model对象使用它来覆盖或扩展其属性。

在网上搜索答案,阅读文章和书籍后,我想出了几个解决我的问题的方法。
1. 添加一个隐藏类型到我的HTML,并通过Post方法发送它。ViewModel验证器使用隐藏类型的值,并根据需要进行验证。但是我不喜欢隐藏类型的想法。
2. 第二个解决方案是使用自定义模型绑定器,它可以是高级解决方案
3.在路由中添加额外的值,这个解决方案是最好的,Action name可以帮助我的模型理解要验证什么。
4. 还有另一种解决方案可以添加Modelstate修改、删除属性,
但我将使用第三个选项,另外我认为使用REST逻辑,并根据HTTP方法验证