C# 如何根据标签更改验证消息

C# 如何根据标签更改验证消息,c#,asp.net-mvc,C#,Asp.net Mvc,我的模型中有一个“VehiclePrice”字段,我在上面使用了不同的标签。我有3个不同的“div”,其中只有一个将根据下拉选择“Car”、“Truck”或“SUV”显示。标签是“轿车价格”、“卡车价格”和“SUV价格”。我是MVC新手,作为一个数据库专家,我不喜欢创建3个不同的字段来保存同一个东西——“价格”。我需要验证消息在弹出“必需”或“范围”消息时引用特定标签,即“汽车价格是必需的”、“卡车价格必须在10000到900000之间”等,而不仅仅是“价格是必需的”。为什么?因为在同一个“di

我的模型中有一个“VehiclePrice”字段,我在上面使用了不同的标签。我有3个不同的“div”,其中只有一个将根据下拉选择“Car”、“Truck”或“SUV”显示。标签是“轿车价格”、“卡车价格”和“SUV价格”。我是MVC新手,作为一个数据库专家,我不喜欢创建3个不同的字段来保存同一个东西——“价格”。我需要验证消息在弹出“必需”或“范围”消息时引用特定标签,即“汽车价格是必需的”、“卡车价格必须在10000到900000之间”等,而不仅仅是“价格是必需的”。为什么?因为在同一个“div”中还有其他“Price”标签。 我的指示是,我需要使用@Html验证内容,这似乎很难修改。
有没有一种简单的方法来覆盖消息,或者至少在消息前面加上或附加“Car”、“Truck”或“SUV”?或者可以替代某些“data val-*”属性。

我会将车辆类型属性添加到视图模型中,并在视图中使用bool变量,通过document.ready事件中的JQuery将文本框设置为启用或未启用。如果禁用的变量为false,则将忽略文本框的验证。对于每个车型分类,使用以下代码

@Html.TextBoxFor(r => r.VehiclePrice, new { @type = "range", min = 10000, max = 15000 }, disabled)  
@Html.ValidationMessageFor(r => r.VehiclePrice,"Price must be between 10000 and 15,000")  

第一次呈现视图时,
jquery validate
解析验证消息。您可以根据所选的车辆类型更改
VehiclePrice
属性的相关
data val-*
属性,然后重新分析验证器。假设select的html是

<select id="vehicletype">
  <option value="Car">Car</option>
  <option value="Truck">Truck</option>
</select>

注意:如果返回视图,您还需要在回邮时检查车辆类型,并调整ModelState错误消息以适应此情况

验证消息是静态的,并在呈现视图时进行解析。一些选项是:(a)处理
车辆价格
文本框的
.change
事件,使用
.valid()
测试i有效,如果没有,则更新相关消息,或(b)处理下拉列表中的
change
事件并重写
$.validator.messages
我应该提到这个视图还使用了jquery.validate.unobtrusive和一堆“kendo”东西——我对这些都一无所知。但它们似乎覆盖了我试图在jquery中执行的任何操作。对于那些对我来说是“负1-ed”的人来说,对于那些不熟悉ASP.NET MVC的人来说,不加解释就这么做是没有什么用处的。然后展示你已经尝试过的东西!在过去的6个小时里,我一直在研究这个问题,我尝试了很多不起作用的东西。所有这些都很简单,下面是一个看起来应该有效的示例:@Html.EditorFor(model=>model.MyNumberField,new{data\u val\u number=“Car Price is Required!”)。但它不起作用。你误解了OP的要求!OP已经有了这一点,但希望根据选项的选择来更改信息(“汽车价格…”或“卡车价格…”)。好吧,这会处理“范围”问题,但我如何处理“必需”?@McAuley,这会如何处理范围问题。如果您选择了一辆汽车或一辆卡车,它会给出相同的消息-您表示需要不同的消息。我还建议您坚持使用内置的MVC功能-虽然这是可能的,但很复杂,然后您需要在服务器上复制条件检查,并在返回视图时生成自定义消息。更好的方法可能是使用具有3个
Price
属性的视图模型,并用[傻瓜式]()
[RequiredIf]
属性修饰,但在视图模型中。由于不保存视图模型,而是将其属性映射到数据模型并保存,因此不需要使用
[NotMapped]
。这3个属性将分别具有标签的
[Display]
属性,以及带有特定消息的
[Required]
[Range]
属性,然后根据所选选项隐藏或显示相应的元素侧注:您可能需要添加
$(“#vehicletype”)。触发器('change')
document.ready()
中,因此在第一次呈现页面时会更新错误消息。
$('#vehicletype').change(function() {
  // Update error message
  var message= 'The ' + $(this).val() + ' price is required';
  $('#VehiclePrice').attr('data-val-required', message);
  // Reparse validator
  $('form').data('validator', null);
  $.validator.unobtrusive.parse($('form'));
});