【问题标题】:After Implementing Validations in c#, I face problems in updating records在 c# 中实现验证后,我在更新记录时遇到问题
【发布时间】:2019-03-10 13:40:01
【问题描述】:

我正在使用 Asp.net c# MVC 开发一个项目,我想使用数据注释对模型进行验证,如下所示:

public class MainRepository
{
   public int Id { get; set; }

   [Required]
   public int Category_Id { get; set; }

   [Required]
   public int Department_Id { get; set; }

   [Required]
   public DateTime Start_Date { get; set; }
}

我有一个控制器作为 PM 控制器,具有以下注册方法。

public ActionResult Register()
{
       var event_category = _context.Event_Categories.ToList();
       var departments = _context.dept.ToList();
       var vm = new InsertEdit_ViewModel
       {
           evt_catgrss = event_category,
           depts = departmetns 
       };
       return View(vm);
   }

这是 InsertEdit 视图模型:

public class InsertEdit_ViewModel
{
    public MainRepository Main_RP { get; set; }
    public List<Event_Categories> evt_catgrss { get; set; } 
    public List<Departments> depts { get; set; }
}
    public InsertEdit_ViewModel()
    {
        Main_RP = new MainRepository();
        evt_catgrss = new List<Event_Categories>();
        depts = new List<Departments>();
    }
}

这是注册方法的视图:

@model Project.ViewModel.InsertEdit_ViewModel

@using (Html.BeginForm("Store", "PM", FormMethod.Post, new { enctype = "multipart/form-data"}))
{
<div class="form-group">
    <label>Event Category</label><br/>
    @Html.DropDownListFor(a => a.Main_RP.Category_Id, new SelectList(Model.evt_catgrss, "Id", "type_of_event"), "Select a category", new { @class = "form-control btn-group dropdown-menu" })

    @Html.ValidationMessageFor(a=> a.Main_RP.Category_Id)
</div>

<div class="form-group">
    <label>Department</label>
    @Html.DropDownListFor(a => a.Main_RP.Department_Id, new SelectList(Model.depts, "Id", "DepartmentName"), "Select Employee Department", new { @class = "form-control btn-group dropdown-menu" })
    @Html.ValidationMessageFor(a=> a.Main_RP.Department_Id)
</div>

<div class="form-group">
    <label>Start Date</label>
    @Html.TextBoxFor(a => a.Main_RP.Start_Date, "Select Estimated Date of Start", new { @class = "form-control", @readonly = "readonly", @style = "cursor :default; background-color:#d4d4d4; font-size:11px;" })
    @Html.ValidationMessageFor(a=> a.Main_RP.Start_Date)
</div>


@Html.AntiForgeryToken();
<button class="btn btn-primary">Register</button>

}

最后这是 PM 控制器中的 Store 方法

 [HttpPost]
 [ValidateAntiForgeryToken]
 public ActionResult Store(InsertEdit_ViewModel pmI)
 {
       if (!ModelState.IsValid)
       {

       var event_category = _context.Event_Categories.ToList();
       var departments = _context.dept.ToList();
       var vm = new InsertEdit_ViewModel
       {
           evt_catgrss = event_category,
           depts = departmetns 
       };


        return View("Register",vm);
        }
        _context.main_repz.Add(pmI.Main_RP);
        _context.SaveChanges();
        return RedirectToAction("Index", "SystemAdmin");
   }

现在直到这一部分一切正常,包括验证。但是每当我想用另一种方法更改事件的日期时,我都会遇到问题,如下所示:

这是 PM 控制器中的更改方法:

public ActionResult Change(int? Id)
  {
      var EventDetails = _context.main_repz.Include(a => a.Event_Categories).SingleOrDefault(a => a.Id == Id);

      var vm = new ChangeVM()
      {
          Main_RP = EventDetails

      };

      return View(vm);
  }

这是 ChangeVM (ViewModel)

public class ChangeVM
{
  public MainRepository Main_RP { get; set; }
  public ChangeVM()
  {
     Main_RP = new MainRepository();
  }
}

这是更改方法的视图

@model FEFA_MIS.ViewModel.ChangeVM


@using (Html.BeginForm("ChangeDate", "PM", FormMethod.Post, new { enctype = "multipart/form-data" }))
{


<div class="form-group">
    <label>Select New Date</label>
    @Html.TextBoxFor(a => a.Main_RP.Start_Date, "{0:}", new { @class = "form-control"})
    @Html.ValidationMessageFor(a=> a.Main_RP.Start_Date)
</div>
@Html.AntiForgeryToken();
@Html.HiddenFor(a => a.Main_RP.Id);
<button class="btn btn-primary">Request</button>
}

最后这是 PM 控制器中的 ChangeDate 方法

   [HttpPost]
   [ValidateAntiForgeryToken]
   public ActionResult ChangeDate(ChangeVM ap)
   {
       if (!ModelState.IsValid)
       {


           return View("Change",ap);
       }


       var item = _context.main_repz.Single(a => a.Id == ap.Main_RP.Id);
       item.Start_Date = ap.Main_RP.Start_Date;
       _context.SaveChanges();
       return RedirectToAction("Success", "PM");
   }

现在这一次不正常了,

意思是,如果我不选择新的日期,它会给出验证消息,这很好。

但是当我选择新日期时它不会继续,因为我认为它也期望 Category_Id 和 Department_Id,但它们不再是 ChangeDate 方法的一部分,它们是用于注册的 Store 方法的一部分。

如果我没记错的话,我认为模型中的所有三个 [Required] 字段都属于一个 ModelState,但无论如何我被困在这里......

有什么解决办法?视图模型可以只访问特定的属性而不是调用整个类(就像我的例子一样)吗?

【问题讨论】:

  • @haim770 正如你在我的代码中看到的,有两种不同的视图模型

标签: c# asp.net-mvc validation


【解决方案1】:

我不会在您的 ChangeVM 中使用 MainRepository。这包括所有属性。相反,将您的 ViewModel 限制为仅在该视图中实际处理的那些字段。所以,只需在 ChangeVM 中添加 Id 和 Start_Date,就可以了。

【讨论】:

  • 是的,你是对的,我也想过这个解决方案,但不知道如何访问 ChangeVM 中的这两个特定字段,我忘记了语法,你能帮忙吗??
  • 就像你的 MainRepository:public class ChangeVM { public int Id { get; set; } [Required] public DateTime Start_Date { get; set; } }
  • 虽然,您很可能希望 [Required] 属性也适用于 Id 属性。
  • 你为什么在 ChangeVM 中使用 [Required],因为它已经在 Model 中定义,我应该在两个地方都使用它吗?还是我应该从 Model 中删除它并在 ViewModel 中使用它,就像你在 ChangeVM 中所做的那样?
  • 由于您要从 ChangeVM 中删除 MainRP,您也将无法再访问其 Id 属性。这就是为什么它必须直接在 ChangeVM 中。
【解决方案2】:

当您尝试执行更新操作时,您必须提供所需的属性值。这是强制性的。 谢谢

【讨论】:

    猜你喜欢
    • 2021-09-15
    • 2015-12-26
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    相关资源
    最近更新 更多