【问题标题】:Custom validation attribute is not working for button click自定义验证属性不适用于按钮单击
【发布时间】:2023-03-16 09:42:02
【问题描述】:

我已经创建了一个函数,用于根据下拉列表中的选择对文本框输入的值进行验证.. ..假设如果下拉列表中选择的项目是 amount 那么文本框中输入的值必须在在像这样的 10 t0 20 之间,我还有两个验证.. 为此,我有一个文本框、一个 dropdwonlist 和一个按钮

当我在文本框中输入值 30 并将下拉列表项选择为“金额”然后单击提交按钮时,视图未显示任何错误消息并且(如果我将文本框留空然后按提交按钮它应该显示错误消息但它没有显示)(我已经编写了自定义函数来在服务器端验证这些函数) 我在 postValues 方法上放了一个断点,但它没有命中...

为此我已经这样做了(控制器部分)

  public class CrossFieldsTxtboxesController : Controller
  {
        public ActionResult Index()
        {
            var itemsforDropdown = new List<SelectListItem> {             
                new SelectListItem{ Text = "Amount" , Value = "Amount"},
                new SelectListItem{Text= "Pound", Value ="Pound"},
                new SelectListItem {Text ="Percent", Value ="percent"}            
            };
            ViewData["Listitems"] = itemsforDropdown;
            return View("DdlCrossFields");
        }
        [HttpPost]
        public ActionResult PostValues(CrossFieldValidation model)
        {
            if (!ModelState.IsValid)
            {
                return View(model);
            }
            else
            {
                return RedirectToAction("DdlCrossFields");                
            }            
        }    
    }

这是我的观点

@model MvcSampleApplication.Models.CrossFieldValidation
@{
    ViewBag.Title = "DdlCrossFields";
}    
<h2>DdlCrossFields</h2>
@using (Html.BeginForm())
{   
    <div class ="editor-field">
      @Html.TextBoxFor(m => m.TxtCrossField)
       @Html.ValidationMessageFor(m=>m.TxtCrossField)
    </div>
    @Html.DropDownList("Listitems",ViewData["Listitems"] as SelectList)
    <input id="PostValues" type="Submit" value="PostValues" />
}

这是我的模型部分

public class CrossFieldValidation
{        
    public string DDlList1
    { get; set; }

    [Required(ErrorMessage = "Quantity is required")]
    [Display(Name= "Quantity:")]
    [ValueMustbeInRange]
    [NumericAttributes] 
    public string TxtCrossField
    { get; set; }
}

有没有人知道为什么它不适用于按钮点击,任何建议也将不胜感激 非常感谢..

【问题讨论】:

  • 这个问题目前被标记为 MVC3 和 MVC4;你实际使用的是哪个?
  • 我正在使用 Visual Studio 2012...和 ​​mvc 4

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 razor


【解决方案1】:

我没有看到您指定应处理 POST 请求的操作的任何地方(在您的情况下为PostValues)。您可以使用 Html.BeginForm 的重载并明确指定 POST 操作名称:

Html.BeginForm("PostValues", "CrossFieldsTxtboxes")

如果我是对的,您的 POST 请求会转到 Index 操作,因此不会在此处检查 ModelState.IsValid

您可以使用 jQuery Unobtrusive 验证插件来使用客户端验证。请检查您的web.config 文件中是否有以下键:

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

但请注意,自定义验证属性需要额外的 JavaScript 代码才能在客户端上运行。

【讨论】:

  • 我已经检查了网络配置文件,一切正常
  • 感谢我收到此错误“没有具有键 'Listitems' 的 'IEnumerable' 类型的 ViewData 项。”在这一行 @Html.DropDownList("Listitems",ViewData["Listitems"] as SelectList).. 你能帮忙解决这个问题吗....
  • 是在你向PostValues提交表单之后吗?您还需要在PostValues 方法中初始化ViewData["ListItems"],只需在单独的方法中重构创建列表项并在IndexPostValues 中使用它
【解决方案2】:

我没有看到你在发帖时实际调用该方法的位置 - 你有 javscript 点击处理程序吗?

您需要在您的Html.BeginForm() 中包含您想要访问的方法和控制器,或者您可以在您的视图中包含如下内容:

 @Html.ActionLink("Post Values", "PostValues", "CrossFieldsTxtboxesController", null, new { @class = "postValuesButton", onclick = "return false;" })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 2015-05-09
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多