如何在控制器POST方法中添加通知消息以验证视图模型数据

本文关键字:消息 验证 视图 数据 模型 通知 添加 控制器 POST 方法 | 更新日期: 2023-09-27 18:12:02

我正试图添加一个notification message,这是基于客户端是否有errorinput

问题是,如果客户端没有输入正确的详细信息,并且我HAVE尝试将message code放在我认为有意义的code method的不同部分,我不知道该将其放在哪里。

我知道如何在没有ViewModel的情况下执行,因为您只使用了Model.IsValidif语句。这就是我在某个controllers上所做的,我没有使用ViewModel。我还尝试在代码中添加一个Model.IsValidif语句和ViewModel,但也不起作用。

我可以把success message放在正确的位置,但无论我把error message放在哪里,它似乎仍然与success message同时出现,这是不正确的。实际上,如果客户端没有select或输入了错误的内容,它就会弹出,从而阻止成功创建。

这是我使用ViewModel:的POST方法的代码

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(DeliveryVM model)
        {
            Delivery delivery = new Delivery()
            {
                DriverID = model.DriverID,
                Created_Date = DateTime.Now,
                Created_Time = DateTime.Now
            };
            db.Deliverys.Add(delivery);
            db.SaveChanges();
            // save the selected orders based on the ID of the Delivery object
            IEnumerable<int> selectedOrders = model.Orders.Where(o => o.IsSelected).Select(o => o.ID);
            foreach (int ID in selectedOrders)
            {
                Order order = db.Orders.Where(o => o.OrderID == ID).FirstOrDefault();
                order.DeliveryID = delivery.DeliveryID;
                db.Entry(order).State = EntityState.Modified;
            }
            var driver = from ord in db.Drivers where ord.DriverID == delivery.DriverID select ord;

            foreach (Driver ord in driver)
            {
                    ord.DriverStatus = "Unavailable";
            }
        if (ModelState.IsValid)
        {
            db.SaveChanges();
            Success(string.Format("Delivery No: {0} was successfully created!", delivery.DeliveryID), true);
            return RedirectToAction("Details", new { id = delivery.DeliveryID });
        }
        // Error
        Danger("Oh Snap! Looks like something went wrong!", true);
        return View(model);
        }

请注意,Success(string.Format("Delivery No: {0} was successfully created!", delivery.DeliveryID), true);放置正确。

有了Danger("Oh Snap! Looks like something went wrong!", true);,我把它放在哪里并不重要,它仍然会在Delivery变成created后弹出,而不是在有error时弹出。我解释了为什么我认为我应该把我做的地方放在代码片段中,但我错了。

有人能帮我把error message放在哪里吗?这样,当用户没有选择任何值或输入错误的详细信息时,error就会弹出?

视图:

            <div class="form-group">
                @Html.LabelFor(model => model.DriverID, "Driver Name", htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.DropDownListFor(m => m.DriverID, Model.DriverList, "-Please select-", htmlAttributes: new { @class = "form-control" })
                    @Html.ValidationMessageFor(model => model.DriverID, "", new { @class = "text-danger" })
                </div>
            </div>

如何在控制器POST方法中添加通知消息以验证视图模型数据

Use Modelstate is valid
if(modelstate.isvalid()){
     viewbag.sucess="data entered sucessfully"
    }
    else{
         viewbag.error="somerhing went wrong";
    }
 use that or call viewbag.success or viewbag.error on view where you want to use thanks maybe it will help for you

首先,检查验证的正确方法是:

if (ModelState.IsValid)
{
    // Success
    // Save or whatever
    return RedirectToAction("Foo");
}
// Error
return View(model);

这样,除非验证成功,否则您甚至不会尝试保存。此外,很容易看出错误消息和成功消息应该发送到哪里。

其次,即使您所拥有的可以工作,您也必须考虑代码是如何运行的。首先,调用Danger,并且它总是被调用,无论保存最终是否成功。然后您尝试保存。在保存成功的情况下,您已经调用了Danger,因此会得到错误消息成功消息。在保存失败的情况下,将生成一个500错误,这意味着处理将移交给错误处理程序,以显示通用服务器错误消息、500.html的内容或处理500的任何自定义操作。无论如何,您呼叫Danger的事实早已不复存在。

可以捕获异常,然后做出相应响应:

try
{
    db.SaveChanges();
}
except (DbEntityValidationException)
{
    Danger("Oh Snap! Looks like something went wrong!", true);
    return View(model);
}

但是,那么,你就不必要地打DB了。使用ModelState.IsValid提供的内置模型验证要好得多。