验证MVC中的下拉列表

时间:2013-10-10 15:04:29

标签: asp.net-mvc validation razor

我是MVC的新手,我仍在尝试探索MVC中的内容。现在我来到了需要为下拉列表实现验证的地方。

我花了相当多的时间在MVC中搜索验证。但我得到任何适合我的问题的结果。请记住,我是MVC的新手,所以如果我的方法对于实现验证是错误的,请纠正我。

我创建了这样的模型类:

   public class ValidationModel
   {
   [Required(ErrorMessage = "Please select atleast one option")]
    public string dropdown { get; set; }
    }
    }

在我的控制器中,我正在使用此代码:

    @using (Html.BeginForm("selectIndex", "Home", FormMethod.Post))
    {
    <select name ="dropdwnMode" id="dropdwnMode" class="textbox">
    <option selected="selected" value="">Select Mode 
    @Html.ValidationMessageFor(Model => Model.dropdown) </option>
     <option value="1"> Add or Update Customer </option>
     <option value="2">Update Customer Credit</option>
     </select>
     }

我想要的是当我的下拉列表处于默认的选择模式时,它应该显示请选择至少一个选项错误,如果用户选择第一个或第二个选项,则不应显示此错误消息。

但是如果我使用上述方法,它现在没有显示任何消息。有人可以指导我实现这个目标吗?

1 个答案:

答案 0 :(得分:4)

我建议用两个属性替换模型上的“Dropdown”属性 - 一个用于保存所选值,另一个用于保存所有可能的值。然后,您可以使用HTML帮助程序(Razor语法)在视图中创建下拉列表,MVC将负责验证。

型号:

public class ValidationModel
{
    /// <summary>
    ///     ID of the selected option
    /// </summary>
    [Required(ErrorMessage = "Please select at least one option")]
    public int SelectedOptionID { get; set; }

    /// <summary>
    ///     Possible values for the dropdown
    /// </summary>
    public IEnumerable<OptionModel> Options { get; set; }
}

OptionModel:

public class OptionModel
{
    /// <summary>
    ///     ID (key that uniquely identifies this option)
    /// </summary>
    public int ID { get; set; }

    /// <summary>
    ///     Name (value or display text that will be shown in the UI)
    /// </summary>
    public string Name { get; set; }
}

如果需要,您还可以在选项模型上存储其他属性。或者,您可以使用键值对或字典而不是选项模型来避免创建一个更快但不太清晰的类。

查看:

@model ValidationModel

@using (Html.BeginForm("selectIndex", "Home", FormMethod.Post))
{
    @Html.ValidationMessageFor(Model => Model.SelectedOptionID)

    @Html.DropDownListFor(m => m.SelectedOptionID,
        new SelectList(Model.Options, "ID", "Name"),
        "Select an option") // Default text before the user has selected an option
}

您可以更好地命名Options和SelectedOptionID,以根据您的实现来阐明其用法。

通过此实现,您将(并且应该)从控制器填充选项列表。当用户选择选项时,将填充所选选项。像这样:

控制器:

public ActionResult YourAction()
{
    ValidationModel model = new ValidationModel();
    model.Options = new List<OptionModel> {
        new OptionModel { ID = 1, Value = "Add or Update Customer" },
        new OptionModel { ID = 2, Value = "Update Customer Credit" }
    }

    return View("YourViewName", model);
}

作为旁注,我建议在使用它的视图之后命名ValidationModel(例如,如果您的视图是整个主页,则为HomepageModel;如果您的视图只是包含导航下拉列表的部分视图,则为NavigationFormModel)