我正在查看本教程http://asp-umb.neudesic.com/mvc/tutorials/validating-with-a-service-layer--cs,了解如何围绕包装器包装我的验证数据.
我想使用依赖注入.我正在使用ninject 2.0
namespace MvcApplication1.Models
{
public interface IValidationDictionary
{
void AddError(string key, string errorMessage);
bool IsValid { get; }
}
}
Run Code Online (Sandbox Code Playgroud)
//包装
using System.Web.Mvc;
namespace MvcApplication1.Models
{
public class ModelStateWrapper : IValidationDictionary
{
private ModelStateDictionary _modelState;
public ModelStateWrapper(ModelStateDictionary modelState)
{
_modelState = modelState;
}
#region IValidationDictionary Members
public void AddError(string key, string errorMessage)
{
_modelState.AddModelError(key, errorMessage);
}
public bool IsValid
{
get { return _modelState.IsValid; }
}
#endregion
}
}
Run Code Online (Sandbox Code Playgroud)
//控制器
private IProductService _service;
public ProductController()
{ …Run Code Online (Sandbox Code Playgroud) [HttpPost]
public ActionResult Create(Users user)
{
if (ModelState.IsValid)
{
db.Users.Add(user);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(user);
}
Run Code Online (Sandbox Code Playgroud)
ModelState.IsValid总是假的.
所以它只是返回视图并且没有添加新记录..
编辑
用户:
public class User
{
public int UserID { get; set; }
public string Name { get; set; }
[Display(Name = "Confirm Password")] [DataType(DataType.Password)]
public string ConfirmPassword { get; set; }
public string Designation { get; set; }
[Display(Name = "Date of Join")] [DataType(DataType.Date)] public DateTime DOJ { get; set; }
public string Email { get; set; }
[Display(Name …Run Code Online (Sandbox Code Playgroud) 在测试我的控制器的动作时,ModelState始终有效.
public class Product
{
public int Id { get; set; }
[Required]
[StringLength(10)]
public string Name { get; set; }
[Required]
public string Description { get; set; }
[Required]
public decimal Price { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
而我的控制器.
public class ProductController : Controller
{
[HttpPost]
public ActionResult Create(Product product)
{
if (ModelState.IsValid)
{
// Do some creating logic...
return RedirectToAction("Display");
}
return View(product);
}
}
Run Code Online (Sandbox Code Playgroud)
并测试:
[Test]
public TestInvalidProduct()
{
var product = new Product();
var controller = new …Run Code Online (Sandbox Code Playgroud) 问题
我有一个用户可以编辑的字段列表.提交模型时,我想检查这些项是否有效.我不能使用数据表示法,因为每个字段都有不同的验证过程,直到运行时才会知道.如果验证失败,我使用ModelState.AddModelError(string key, string error)其中键是要添加错误消息的html元素的名称.由于有一个字段列表,Razor为html项生成的名称就像Fields[0].DisplayName.我的问题是有一种方法或方法从视图模型中获取生成的html名称的密钥?
试图解决方案
我toString()没有运气就尝试了密钥的方法.我也看了整HtmlHelper课,但没有看到任何有用的方法.
代码片段
查看模型
public class CreateFieldsModel
{
public TemplateCreateFieldsModel()
{
FreeFields = new List<FieldModel>();
}
[HiddenInput(DisplayValue=false)]
public int ID { get; set; }
public IList<TemplateFieldModel> FreeFields { get; set; }
public class TemplateFieldModel
{
[Display(Name="Dispay Name")]
public string DisplayName { get; set; }
[Required]
[Display(Name="Field")]
public int FieldTypeID { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
调节器
public ActionResult CreateFields(CreateFieldsModel model)
{
if (!ModelState.IsValid)
{
//Where do I …Run Code Online (Sandbox Code Playgroud) 对于错误消息,验证错误等
ModelState.AddErrorMessage("Fool!");
Run Code Online (Sandbox Code Playgroud)
但是,你在哪里提出成功回应,例如"你成功地向你的前任转移了很多钱".+"你的余额现在为零".我仍然希望在控制器级别设置它,最好是以键值方式设置它,就像错误消息一样,但不会使模型状态失效.
这通常是怎么做的?ViewData的?
我正在开发一个大型的MVC3 Web应用程序,并对该ModelState.IsValid方法感到烦恼.
几乎所有的控制器都使用ModelState,以验证发布的数据.视图都基于包含不同类的ViewModel,这些类显然包含可以标记为的属性[Required].
我遇到的问题是有时不需要所需的属性,我必须使用该ModelState.Remove方法才能ModelState.IsValid成为现实.
我的问题是使用ModelState.Remove,这是正确的做事方式还是更有效的方法.
我有一个使用这样的模型项列表的视图:
List<It4You.AlertBrick.Library.Domain.Order.AbOrderLineItemPicked>
Run Code Online (Sandbox Code Playgroud)
当我获得这个服务器列表时,我检查这是否是一种类型的项目,它必须有一个有效的序列号.如果是另一种类型,我会检查用户是否在"已选中"复选框中添加了复选标记.如果这两个都失败了,我想在此行中添加一个模型状态错误.这样做的最佳方式是什么?
嗨,我对ASP.NET MVC控制器中的ModelState有疑问.
当用户从视图中选择某个选项时,将根据输入的其他日期设置"认证"的开始日期和结束日期.
这个问题是认证日期返回为null,我们的CertificationMetaData类将字段指定为[必需],因此一旦操作加载,ModelState就无效.
手动删除ModelSate错误允许这个工作,但我想知道是否有更好的方法来做到这一点?有没有办法刷新ModelState?我应该不要求这些字段吗?或者我应该使用javascript从视图中添加日期值?
public ActionResult Create(FormCollection fc, Certification certification, Absence absence)
{
if (certification.CertificationTypeID == 1)
{
certification.CertificationStartDate = absence.StartDate;
certification.CertificationEndDate = absence.StartDate.AddDays(7);
this.ModelState.Remove("CertificationStartDate");
this.ModelState.Remove("CertificationEndDate");
}
if (this.ModelState.IsValid)
{
// save
return RedirectToAction("Index");
}
return View();
}
Run Code Online (Sandbox Code Playgroud)
另外,您可以看到我已经对证书类型的ID值进行了硬编码.将值与查找表值进行比较的最佳方法是什么?enum是最好的方式吗?
谢谢
如何显示JSON返回的ModelState错误?
我想做这样的事情:
if (!ValidateLogOn(Name, currentPassword))
{
ModelState.AddModelError("_FORM", "Username or password is incorrect.");
//Return a json object to the javascript
return Json(new { ModelState });
}
Run Code Online (Sandbox Code Playgroud)
在视图中我的代码必须是什么才能读取ModelState错误并显示它们?
我在视图中读取JSON值的实际代码如下:
function createCategoryComplete(e) {
var obj = e.get_object();
alert(obj.Values);
}
Run Code Online (Sandbox Code Playgroud) 有没有办法在ASP.NET MVC回发期间删除ModelState错误,而无需手动编写每个错误.
假设我们有一个复选框Billing Same As Shipping,我们希望忽略用户ShippingAddress在检查时所写的内容 - 通常你可能会做的就是这个.
ModelState.Remove("Checkout.ShipppingAddress.FirstName");
ModelState.Remove("Checkout.ShipppingAddress.LastName");
ModelState.Remove("Checkout.ShipppingAddress.Address1");
ModelState.Remove("Checkout.ShipppingAddress.Address2");
...
ModelState.Remove("Checkout.ShipppingAddress.ZipCode");
Run Code Online (Sandbox Code Playgroud)