我想在不知道键值的情况下从modelState中获取所有错误消息.循环以获取ModelState包含的所有错误消息.
我怎样才能做到这一点?
我在检查我的数据库Create(FooViewModel fvm){...}
,看是否fvm.prop1
和fvm.prop2
在该组合已经存在; 如果是这样,我想向modelstate添加一个错误,然后返回整个视图.我试过了:
public ActionResult Create(FooViewModel fvm){
if (ThatComboAlreadyExists(fvm)) {
ModelState.AddModelError("Model", "There is already one like that");
return View(fvm);
}
}
Run Code Online (Sandbox Code Playgroud)
...但我没有显示错误Html.ValidationSummary
,这是我认为它们会出现的地方.我怀疑"模型"不是正确的关键,但我一直无法找到任何谷歌.
如何获取所有ModelState错误消息的列表?我找到了这个代码来获取所有密钥:( 返回带有ModelState错误的密钥列表)
var errorKeys = (from item in ModelState
where item.Value.Errors.Any()
select item.Key).ToList();
Run Code Online (Sandbox Code Playgroud)
但是,如何将错误消息作为IList或IQueryable获取?
我可以去:
foreach (var key in errorKeys)
{
string msg = ModelState[error].Errors[0].ErrorMessage;
errorList.Add(msg);
}
Run Code Online (Sandbox Code Playgroud)
但那可以手动完成 - 当然有一种方法可以使用LINQ吗?.ErrorMessage属性到目前为止,我不知道如何编写LINQ ...
任何人都可以给我一个关于ModelState在Asp.net MVC中的角色的简洁定义(或者链接到一个).特别是我需要知道在什么情况下打电话是必要的或可取的ModelState.Clear()
.
有点开放了 ......对不起,我想如果告诉你我在做什么可能会有所帮助:
我在一个名为"Page"的控制器上有一个Edit of Action.当我第一次看到表单更改页面的详细信息时,所有内容都很好地加载(绑定到"MyCmsPage"对象).然后,我单击一个按钮,为MyCmsPage对象的某个字段(MyCmsPage.SeoTitle
)生成一个值.它生成正常并更新对象,然后我返回动作结果与新修改的页面对象,并期望相关的文本框(使用渲染<%= Html.TextBox("seoTitle", page.SeoTitle)%>
)更新...但是它显示了加载的旧模型的值.
我通过使用来解决它,ModelState.Clear()
但我需要知道它为什么/如何工作所以我不只是盲目地做.
的PageController:
[AcceptVerbs("POST")]
public ActionResult Edit(MyCmsPage page, string submitButton)
{
// add the seoTitle to the current page object
page.GenerateSeoTitle();
// why must I do this?
ModelState.Clear();
// return the modified page object
return View(page);
}
Run Code Online (Sandbox Code Playgroud)
ASPX:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyCmsPage>" %>
....
<div class="c">
<label for="seoTitle">
Seo Title</label>
<%= Html.TextBox("seoTitle", page.SeoTitle)%>
<input type="submit" value="Generate Seo Title" name="submitButton" />
</div>
Run Code Online (Sandbox Code Playgroud) 如何从View(aspx页面)中访问ModelState?
我在哪里可以找到使ModelState无效的错误列表?我没有在ModelState对象上看到任何错误属性.
我有以下两种操作方法(简化问题):
[HttpGet]
public ActionResult Create(string uniqueUri)
{
// get some stuff based on uniqueuri, set in ViewData.
return View();
}
[HttpPost]
public ActionResult Create(Review review)
{
// validate review
if (validatedOk)
{
return RedirectToAction("Details", new { postId = review.PostId});
}
else
{
ModelState.AddModelError("ReviewErrors", "some error occured");
return RedirectToAction("Create", new { uniqueUri = Request.RequestContext.RouteData.Values["uniqueUri"]});
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果验证通过,我将重定向到另一页(确认).
如果发生错误,我需要显示包含错误的同一页面.
如果我这样做return View()
,则会显示错误,但如果我这样做return RedirectToAction
(如上所述),则会丢失模型错误.
我对这个问题并不感到惊讶,只是想知道你们是怎么处理这个问题的?
我当然可以返回相同的View而不是重定向,但我在"Create"方法中有逻辑,它填充了视图数据,我必须复制它.
有什么建议?
error-handling asp.net-mvc redirecttoaction modelstate http-redirect
我有一个情况,我正在上传用户从他的本地文件系统中选择的图像.在我看来,我的表单基本上有两个提交按钮.一个用于正常提交表单,并执行所有验证.第二个仅用于上传图像,在这种情况下我还不想验证.
我设法关闭客户端验证,给我的"上传图片"提交按钮一个类"取消样式名称",所以
<input type="submit" name="UploadImageButton" value="Upload Image" class="style-name cancel" />
Run Code Online (Sandbox Code Playgroud)
现在,当我回发时,我的模型有一个属性UploadImageButton,当单击此按钮时,它会填充此属性(输入的名称与属性匹配).这样,我知道表单是由我的真实提交按钮还是由UploadImageButton提交的.
我的问题是这样的......如何关闭ServerSide验证?我不希望在用户单击此按钮时显示验证摘要信息.我知道您可以使用此方法添加自定义模型错误
ModelState.AddModelError("{key}", "{error msg}");
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来删除模型错误.这可能吗?
编辑:
这是我想出的:
foreach (var key in ModelState.Keys.ToList().Where(key => ModelState.ContainsKey(key))) {
//ModelState.Remove(key); //This was my solution before
ModelState[key].Errors.Clear(); //This is my new solution. Thanks bbak
}
Run Code Online (Sandbox Code Playgroud) 我正在构建一个ActionFilter
重用一些代码用于简单的垃圾邮件块 - 基本上我所做的是我有一个Html Helper
方法来呈现输入文本框和一个隐藏的输入,并在ActionFilter中我检查这两个值是否相同.如果没有,我想利用我的验证逻辑的其余部分并添加一个ModelStateError
到ModelState
,但我怎么做呢?如何添加一个ModelStateError
来自whithin ActionFilter
?
更新:这是我正在尝试的代码.当我测试具有此属性的控制器操作时,即使我没有传递任何所需的表单值,ModelState.IsValid
仍然会返回true
:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var r = filterContext.HttpContext.Request;
if (r.Form["sixtimesnine"] != r.Form["fourtytwo"] || string.IsNullOrEmpty(r.Form["sixtimesnine"]) || string.IsNullOrEmpty(r.Form["fourtytwo"]))
{
filterContext.Controller.ViewData.ModelState.AddModelError("Spam", this.ErrorMessage);
}
base.OnActionExecuting(filterContext);
}
Run Code Online (Sandbox Code Playgroud)
这是ActionMethod
:
[ValidateAntiSpam(ErrorMessage = "Spambotar får inte.")]
public ActionResult Write(GuestbookPost postToCreate)
{
if (ModelState.IsValid)
{
_posts.Add(postToCreate);
return RedirectToAction("Index");
}
return View();
}
Run Code Online (Sandbox Code Playgroud)
我只是注意到,如果我在OnActionExecuting
方法中设置了一个断点并点击"Debug tests",那么断点就永远不会被击中.为什么?
我已经为ASP.NET MVC Web应用程序编写了我的第一个单元测试.一切正常,它给了我有价值的信息,但我不能在视图模型中测试错误.ModelState.IsValid始终为true,即使未填充某些值(空字符串或null).
我已经读过,当发布的数据映射到模型时,模型验证会发生,您需要编写一些代码来自行进行模型验证:
我已经尝试了链接网页中提供的三个示例,但它似乎对我不起作用.
一些代码:
我的观点模型
...
[Required(ErrorMessageResourceName = "ErrorFirstName", ErrorMessageResourceType = typeof(Mui))]
[MaxLength(50)]
[Display(Name = "Firstname", ResourceType = typeof(Mui))]
public string FirstName { get; set; }
...
Run Code Online (Sandbox Code Playgroud)
控制器
...
[HttpPost]
public ActionResult Index(POSViewModel model)
{
Contract contract = contractService.GetContract(model.ContractGuid.Value);
if (!contract.IsDirectDebit.ToSafe())
{
ModelState.Remove("BankName");
ModelState.Remove("BankAddress");
ModelState.Remove("BankZip");
ModelState.Remove("BankCity");
ModelState.Remove("AccountNr");
}
if (ModelState.IsValid)
{
...
contractValidationService.Create(contractValidation);
unitOfWork.SaveChanges();
return RedirectToAction("index","thanks");
}
else
{
return Index(model.ContractGuid.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
我的单元测试
posViewModel.FirstName = null;
posViewModel.LastName = "";
...
var modelBinder = new ModelBindingContext() …
Run Code Online (Sandbox Code Playgroud)