检查模型状态是否对MVC中的值有效

时间:2015-01-13 11:33:05

标签: c# html asp.net-mvc

我的MVC应用程序中有一个下拉列表,这是我表单中的必填字段。

我已经创建并填写了我的列表:

   @Html.DropDownListFor(x => x.ServiceName,
                    new SelectList(
                        new List<Object>
                        {
                            new { value = "Empty", text = "Select..."},
                            new { value = "Service Name 1", text = "Service Name 1"},
                            new { value = "Service Name 1", text = "Service Name 2"},
                            new { value = "Service Name 1", text = "Service Name 3"},
                            new { value = "Service Name 1", text = "Service Name 4"}
                        },
                            "value",
                            "text",
                            0), new { @class = "form-control" })

我需要我的表单返回一条消息,告诉用户他们需要从此菜单中选择一个选项,他们不会选择任何内容。我的服务名称在我的Model类中位于其上方[Required(ErrorMessage = "Service Name must be selected")]

看起来像这样:

[Required(ErrorMessage = "Service Name must be selected")]
public string ServiceName { get; set; }

但是我不知道如何检查这个值。到目前为止,我已尝试过以下方法:

if(newMember.getProperty("serviceManager").Value == "0")
{
   ModelState.IsValid = false;
}

但这不起作用。我已尝试过上述的一些变体,但它们也没有奏效。我目前正在谷歌上搜索答案,但我没有太多运气。

有人可以向我解释如何实现我想要实现的目标吗?

修改

刚刚更新了我的代码以显示我刚刚完成的新测试,但它仍然没有返回错误,告诉我在提交空表单时必须选择服务。

2 个答案:

答案 0 :(得分:1)

您有getProperty来获取serviceManager,但您查看的是绑定到ServiceName。

尝试将其更改为...

if(newMember.getProperty("ServiceName").Value == "0")

OR

我现在没有可用的视觉工作室,所以代码可能不准确。

@Html.DropDownListFor(x => x.ServiceName,
                new SelectList(
                    new List<Object>
                    {
                        new { value = 1, text = "Service Name 1"},
                        new { value = 2, text = "Service Name 2"},
                        new { value = 3, text = "Service Name 3"},
                        new { value = 4, text = "Service Name 4"}
                    },
                        "value",
                        "text",
                        0), "Select...", new { @class = "form-control" })

如果您在ViewModel中的ServiceName上有[必需],那么在您的控制器中,您将可以执行ModelState.IsValid,例如。

if(ModelState.IsValid){
    // Do code here if it is valid
}else{
    return View(viewModel)
}

答案 1 :(得分:1)

使用呈现选项标签的DropDownListFor()重载,并使ServiceName属性可以为[Required]属性。您现有SelectList的问题是您包含第一个选项,该选项具有值(“Empty”),该值是有效字符串,因此它会通过验证。

模型

[Required]
public string ServiceName { get; set; }

控制器

List<string> services = new List<string>() { "Service Name 1", "Service Name 2", "Service Name 3", "Service Name 4" };
ViewBag.Services = new SelectList(services);
return View(yourModel);

查看

@Html.DropDownListFor(x => x.ServiceName, (SelectList)ViewBag.Services, "--Please Select--", new { @class = "form-control" })
@Html.ValidationMessagFor(x => x.ServiceName)

注意SelectList不包含“--Please Select--”的元素。 DropDownListFor()的第3个参数添加了一个没有值<option value>--Please Select--</option>的标签选项,如果选中此选项将导致该属性无效。