我有一个用于从表中删除对象的表单。我想在按下“删除”按钮之前放置一个可以验证输入的文本字段。
对象的实体模型看起来像这样(它有更多的属性,但我只留下了重要的属性):
public partial class card
{
public string reason { get; set; }
}
POST(删除)请求的控制器方法如下所示:
// POST: /card/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
card temp_card = db.cardss.Find(id);
temp_card.deleted = true;
db.SaveChanges();
if (ModelState.IsValid)
return RedirectToAction("Index");
return View(temp_card);
}
我已经阅读过,我必须创建另一个类并使用MetaDataAnnotations来实现这一点,因为我使用的是实体模型。所以我写了这个:
[MetadataType(typeof(CardMetaData))]
public partial class card
{
public string reason { get; set; }
}
public class CardMetaData
{
[Required(ErrorMessage = "Write a reason for deletion.")]
public string reason { get; set; }
}
在我的Delete.aspx中有以下几行:
<%= Html.ValidationSummary("Delete was unsuccessful.") %>
<div class="display-field">
<%: Html.TextBoxFor(model => model.reason) %>
<%: Html.ValidationMessageFor(model => model.reason) %>
</div>
如果我按下删除按钮并且文本字段为空,则不会显示消息。我错过了什么?
答案 0 :(得分:1)
您需要[Required]
属性Reason
属性的视图模型
public class DeleteConfirmViewModel
{
[Required]
public string Reason { get; set; }
}
然后重做DeleteConfirmed
行动。您当前的实现无法正常工作,因为您首先更新数据库,然后验证您的输入模型是否正确。接下来,如果模型无效,则不应重定向,因为您将丢失包含错误(消息)的ModelState
。 DeleteConfirmed
的正确实现将如下所示:
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id, DeleteConfirmViewModel viewModel)
{
if (ModelState.IsValid)
return View(viewModel);
card temp_card = db.cardss.Find(id);
temp_card.deleted = true;
temp_card.reason = viewModel.Reason;
db.SaveChanges();
return View(temp_card);
}
在您查看时,如果没有给出理由,您需要显示验证消息
@Html.ValidationMessageFor(m => m.Reason)
因此,视图中原因字段的工作输入字段设置可能如下所示
@Html.LabelFor(m => m.Reason)
@Html.EditorFor(m => m.Reason)
@Html.ValidationMessageFor(m => m.Reason)
修改强>
要呈现DeleteConfirmed
视图,您需要创建视图模型并将其传递给视图
[HttpGet, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
return View(new DeleteConfirmViewModel());
}
答案 1 :(得分:0)
[HttpPost]
public ActionResult ControllerName(ModelClassName viewModel)
{
if (!ModelState.IsValid)
return View("ViewName", viewModel);//passes validation errors back to the view
//do w.e
}