我正在创建一个asp.net mvc 2应用程序,根据用户输入动态生成我的视图模型.简而言之,用户可以在他的视图中选择他想要查看的字段.
由于模板化助手严重依赖于模型属性和属性(数据注释),因此我需要以某种方式在运行时将属性添加到视图模型中.不必说这不是一项简单的任务.
那么,你们在这种情况下建议我做什么?我无法静态添加属性,所以我应该继续尝试动态添加它们,即使它是很多工作还是我应该尝试使用不同的方法?
提前致谢!
费利佩
我有一个自定义验证属性,它检查两个属性是否具有相同的值(如密码和重新键入密码):
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class EqualToPropertyAttribute : ValidationAttribute
{
public string CompareProperty { get; set; }
public EqualToPropertyAttribute(string compareProperty)
{
CompareProperty = compareProperty;
ErrorMessage = string.Format(Messages.EqualToError, compareProperty);
}
public override bool IsValid(object value)
{
if (value == null)
{
return true;
}
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value);
var property = properties.Find(CompareProperty, true);
var comparePropertyValue = property.GetValue(value).ToString();
return comparePropertyValue == value.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个视图模型类,其中包含注册表单的所有字段,如下所示:
public class SignUpViewModel
{
[Required]
[StringLength(100)]
public string Username { get; set; }
[Required] …Run Code Online (Sandbox Code Playgroud) 我正在开发一个MVC2应用程序.
我使用数据注释来验证数据(客户端和服务器端).我的模型中有几个字段只允许十进制值.一旦用户键入十进制值,我希望它转换为逗号分隔更可读的格式.例如,1200应格式化为1,200,而500应保持原样.
这是我的模型:
public virtual GrossFee? Fee { get; set; }
Run Code Online (Sandbox Code Playgroud)
以下是它在视图中的表现:
%: Html.TextBoxFor(model => model.GrossFee)%>
Run Code Online (Sandbox Code Playgroud)
任何关于此的想法将受到高度赞赏.
谢谢!
我知道在Razor View文件中,我们可以做这样的事情@Html.TextBox("username",null,new {maxlength = 20,autocomplete ="off"})
但是,我希望为MVC创建一个模型,该模型可用于创建一个明确定义文本框大小和最大长度的表单.我在模型的属性上尝试[StringLength(n)],但这似乎只进行验证而不是设置文本框的大小.
无论如何,我们可以将文本字段的长度定义为模型属性顶部的数据注释吗?
因此,最终,我们可以通过使用razor映射到模型来创建整个表单,而不是逐个明确地拾取模型属性以设置文本框大小.
我有一个案例,复杂的局部视图需要根据部分视图的使用位置进行不同的字段验证.
我认为我可以通过使局部视图将接口作为模型类型并基于接口实现两个不同的ViewModel来解决这个问题.两个ViewModel中的数据注释会有所不同.然后,我将向部分视图提供正确的ViewModel的实例.
但我发现,唯一被识别的注释是界面本身的注释.实现ViewModel类的接口上的DA被忽略,即使这些是作为模型传递的对象.所以我的计划不起作用.
有没有解决的办法?更好的方法?如果可以避免,我宁愿不将局部视图拆分为单独的视图.
ETA:这是部分视图的缩写版本,如下所示:
@model IPerson
@Html.ValidationSummary(false)
<fieldset>
<table class="editForm">
<tr>
<td class="editor-label">
@Html.LabelFor(model => model.FirstName)
</td>
<td class="editor-field">
@Html.EditorFor(model => model.FirstName)
@Html.ValidationMessageFor(model => model.FirstName)
</td>
<td class="editor-label">
@Html.LabelFor(model => model.LastName)
</td>
<td class="editor-field">
@Html.EditorFor(model => model.LastName)
@Html.ValidationMessageFor(model => model.LastName)
</td>
</tr>
</table>
<fieldset>
Run Code Online (Sandbox Code Playgroud)
真正的局部视图很长,有很多@if语句管理可选部分的渲染(或不渲染),但它没有做任何棘手的事情.
当您使用Required属性修饰模型对象的属性并且未指定ErrorMessage 或者ResourceType/Name以"{0}字段是必需的"的插值形式获得验证消息时,其中param 0是该DisplayName属性的属性的值.
我想将该默认字符串更改为其他内容,但我想保留它的通用性,即我不想指定ErrorMessage或ResourceType/Name模型对象的每个属性.存储的默认字符串在哪里?如何更改它?
我有一个ExtendedAttribute的扩展类,它不会发回错误消息.如果我在调试器中检查它,文本就没问题了.
public class VierRequired : RequiredAttribute
{
public VierRequired(string controlName)
{
//...
}
public string VierErrorMessage
{
get { return ErrorMessage; }
set { ErrorMessage = value; }
}
// validate true if there is any data at all in the object
public override bool IsValid(object value)
{
if (value != null && !string.IsNullOrEmpty(value.ToString()))
return true;
return false; // base.IsValid(value);
}
}
Run Code Online (Sandbox Code Playgroud)
我这样称呼它
[VierRequired("FirstName", VierErrorMessage = "Please enter your first name")]
public string FirstName { get; set; }
Run Code Online (Sandbox Code Playgroud)
和mvc-view
<%: …Run Code Online (Sandbox Code Playgroud) 问题:
我尝试验证嵌套模型,但在嵌套模型实例创建时,数据注释属性未执行.
public class Model
{
[Required]
string MainTitle {get;set;}
public NestedModel NestedModel { get; set; }
}
public class NestedModel
{
[Required]
string SubTitle {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
在控制器:
public ActionResult GetTitles(Model model)
{
if(ModelState.IsValid)
{
//Submodel is always valid even if the sub-title is null.
}
}
Run Code Online (Sandbox Code Playgroud)
Mvc4不支持吗?如何将验证扩展到这方面?
嗨,我在我的Asp.net MVc模型中有以下内容
TestModel.cs
public class TestModel
{
public double OpeningAmount { get; set; }
[Required(ErrorMessage="Required")]
[Display(Name = "amount")]
[Range(0 , double.MaxValue, ErrorMessage = "The value must be greater than 0")]
public string amount { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在从我的控制器"OpeningAmount"分配.
最后,当我提交表格时,我想检查"金额"必须大于"OpeningAmonut".所以想要动态设置范围
[Range(minimum = OpeningAmount , double.MaxValue, ErrorMessage = "The value must be greater than 0")]
Run Code Online (Sandbox Code Playgroud)
我不想只使用Jquery或javascript,因为它只检查客户端,所以我可以动态地设置Range属性最小值.
我有一个MVC 5应用程序,我正在使用数据注释来进行大部分验证.我班级中的一个属性如下所示:
[Required(ErrorMessage = "Please enter a business name")]
[StringLength(80)]
public string BusinessName { get; set; }
Run Code Online (Sandbox Code Playgroud)
验证工作正常,但它似乎并没有像我认为的那样在浏览器中发生.在我的页面上,我有一个保存按钮.如果我将"业务名称"字段留空并单击"保存",则会对控制器方法发布一个帖子,该方法部分地查看,如下所示:
[HttpPost]
public ActionResult Create(Advertiser advertiser, FormCollection collection, HttpPostedFileBase file)
{
// Before we do anything, let's check to make sure any validation that's already been done is clean.
if (!ModelState.IsValid)
{
return View(advertiser);
}
...
...
}
Run Code Online (Sandbox Code Playgroud)
执行此方法时,模型状态已设置为无效.这很好,因为它无效,因为商家名称字段为空.但是,不应该在客户端进行此验证吗?
我的.cshtml文件中的字段如下所示(使用Bootstrap):
<div class="form-group">
@Html.Label("Business Name", new { @class = "control-label col-md-3" })
<div class="col-md-9">
@Html.TextBoxFor(model => model.BusinessName, new { @class = "form-control", title = …Run Code Online (Sandbox Code Playgroud) data-annotations ×10
c# ×5
asp.net-mvc ×4
asp.net ×1
format ×1
html-helper ×1
interface ×1
numbers ×1
razor ×1