如何在控制器POST方法中添加通知消息以验证视图模型数据
本文关键字:消息 验证 视图 数据 模型 通知 添加 控制器 POST 方法 | 更新日期: 2023-09-27 18:12:02
我正试图添加一个notification message
,这是基于客户端是否有error
和input
。
问题是,如果客户端没有输入正确的详细信息,并且我HAVE尝试将message code
放在我认为有意义的code method
的不同部分,我不知道该将其放在哪里。
我知道如何在没有ViewModel
的情况下执行,因为您只使用了Model.IsValid
if语句。这就是我在某个controllers
上所做的,我没有使用ViewModel
。我还尝试在代码中添加一个Model.IsValid
if语句和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>
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
提供的内置模型验证要好得多。