【问题标题】:Facing issues with validations in C#面临 C# 中的验证问题
【发布时间】:2019-03-10 06:16:03
【问题描述】:

我想向用于更改事件日期的表单添加验证。如果用户忘记选择新日期,我想通知他们应该选择一个新日期。

在我的模型中,我对该特定属性使用了数据注释,如下所示:

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

这是更改日期的控制器

public ActionResult Change(int? Id)
    {
        var dtl = _context.pm_main_repz.Include(a => a.PM_Evt_Cat).SingleOrDefault(a => a.Id == Id);
        if (dtl == null)
        {
            return Content("No item found!");
        }
        var vm = new PM_InsertEdit_ViewModel()
        {
            pm_main_rep = dtl,


        };

        return View(vm);
    }

这是更改日期的视图

 @model Project.ViewModel.PM_InsertEdit_ViewModel

 @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.pm_main_rep.Estimated_Start_Date, new { @class = "form-control"})
    @Html.ValidationMessageFor(a=> a.pm_main_rep.Estimated_Start_Date)
</div>

@Html.AntiForgeryToken();
@Html.HiddenFor(a => a.pm_main_rep.Id);
<button class="btn btn-primary">Request</button>
}

现在这是我控制器中的 ChangeDate 方法

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult ChangeDate(PM_InsertEdit_ViewModel ap)
    {

        var item = _context.pm_main_repz.Single(a => a.Id == ap.pm_main_rep.Id);
        item.Estimated_Start_Date = ap.pm_main_rep.Estimated_Start_Date;

        _context.SaveChanges();
        return RedirectToAction("Success", "PM");
    }

请注意,如果我不通过检查 ModelState 来强制验证,到目前为止一切正常,但如果我这样做,它不会识别部分代码并用红色下划线。

这是我想在 ChangeDate 方法中检查 ModelState 时的代码。基本上我希望用户应该保持在同一个视图中,除非他们选择一个新的日期。

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult ChangeDate(PM_InsertEdit_ViewModel ap)
    {

  if (!ModelState.IsValid)
        {
            var dtl = _context.pm_main_repz.Include(a => a.PM_Evt_Cat).SingleOrDefault(a => a.Id == Id);   // Note: It underlines the Id with red and says: The Name Id does not exist in the current context
            var vm = new PM_InsertEdit_ViewModel()
            {
                pm_main_rep = dtl,
            };
            return View("Change",vm);
        }

        var item = _context.pm_main_repz.Single(a => a.Id == ap.pm_main_rep.Id);
        item.Estimated_Start_Date = ap.pm_main_rep.Estimated_Start_Date;

        _context.SaveChanges();
        return RedirectToAction("Success", "PM");
    }

错误如下:

名称Id在当前上下文中不存在,

即使我接近解决这个问题,但我在逻辑的某个地方感到困惑。

【问题讨论】:

  • 在这一行:SingleOrDefault(a =&gt; a.Id == Id),第二个 ID 应该是什么?
  • @TanvirArjel 这一行,var dtl = _context.pm_main_repz.Include(a => a.PM_Evt_Cat).SingleOrDefault(a => a.Id == Id);
  • @TanvirArjel 写一个答案,这也将有助于 OP,它将帮助未来的读者。像这样的 QA 网站的精神就是回答问题。

标签: c# asp.net-mvc validation


【解决方案1】:

ModelState.IsValid 仅使用在您的代码中为 PM_InsertEdit_ViewModel 的默认模型绑定器进行验证。这不是您遇到的编译器错误的一部分。您可以尝试删除该行,然后将 ap 参数返回给视图,如下所示:return View("Change", ap);

当 IsValid 无效时,您可以返回 Action 收到的数据,以便用户可以编辑他/她的输入。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多