问题
我有一个用户可以编辑的字段列表.提交模型时,我想检查这些项是否有效.我不能使用数据表示法,因为每个字段都有不同的验证过程,直到运行时才会知道.如果验证失败,我使用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) 我已经实现了一个MVC扩展来格式化我的应用程序中的数字.它基于此处的代码.如下
public static MvcHtmlString DecimalBoxFor<TModel>(this HtmlHelper<TModel> html, Expression<Func<TModel, double?>> expression, string format, object htmlAttributes = null)
{
var name = ExpressionHelper.GetExpressionText(expression);
double? dec = expression.Compile().Invoke(html.ViewData.Model);
var value = dec.HasValue ? (!string.IsNullOrEmpty(format) ? dec.Value.ToString(format) : dec.Value.ToString()): "";
return html.TextBox(name, value, htmlAttributes);
}
Run Code Online (Sandbox Code Playgroud)
当我使用以下Razor语法行调用它时
@Html.DecimalBoxFor(model => Model.PointAttributes[i].Data.Y,"0.000", new { @class = "span1 number" })
Run Code Online (Sandbox Code Playgroud)
我得到一个例外,因为我的扩展名中的变量'name'是一个空字符串.我已经尝试将var name行更改为this但它只给了我'Y'的属性名称,而不是我需要将模型绑定回MVC的完整'Model.PointAttributes [i] .Data.Y'.
var name = ((expression.Body is MemberExpression ?((MemberExpression)expression.Body).Member : ((MemberExpression)((UnaryExpression)expression.Body).Operand).Member)).Name;
Run Code Online (Sandbox Code Playgroud) 我有以下代码来生成html输入和验证消息.
@Html.ValidationSummary(false)
......
<div class="col-md-10">
@Html.TextBoxFor(model => model.ImageUpload, new { type = "file", name = "file" })
@Html.ValidationMessageFor(model => model.ImageUpload)
</div>
Run Code Online (Sandbox Code Playgroud)
在我的行动中我有代码
if (.... something wrong with the input ....)
{
ModelState.AddModelError("", "Invalid image file.");
return RedirectToAction(....
Run Code Online (Sandbox Code Playgroud)
但是,它将在验证摘要部分中显示错误消息.是否可以在验证消息部分显示错误消息以进行输入?