【问题标题】:ASP.NET MVC. Validation fails on dropdown no matter the valueASP.NET MVC。无论值如何,下拉验证都会失败
【发布时间】:2010-01-16 12:48:08
【问题描述】:

我的 MVC 应用程序中有一个带有下拉列表的表单。现在我正在尝试将验证添加到组合中,似乎下拉列表的验证失败,无论它的值是什么。

如果没有验证,它将允许控制器按计划工作和重定向。通过验证,它似乎确实允许发生数据库更改,但 ModelState.IsValid 为 false。

我被困住了。这是一个已知问题吗?

查看:

<label for="parent">Child of:</label>
<%= Html.DropDownList("parent", (SelectList)ViewData["pageList"])%>
<%= Html.ValidationMessage("parent") %>

控制器动作:

[AcceptVerbs(HttpVerbs.Post)]
[ValidateInput(false)]
[ValidateAntiForgeryToken()]
public ActionResult Create(Page page)
{
    try
    {
        pageRepository.Insert(page);
    }
    catch (RuleException ex)
 {  
     ex.CopyToModelState(ModelState);
 }

 if (!ModelState.IsValid)
 {
     var pageSelectList = pageRepository.GetTop().ToList();
     pageSelectList.Add(new Page
 {
     menuTitle = "None"
 });
     ViewData["pageList"] = new SelectList(pageSelectList.OrderBy(x => x.listOrder), "ID", "menuTitle");
     return View();
 }
 return RedirectToAction("List");
}

返回的错误是:值'x'无效。 其中“x”是当前选择的数值。无论选择的值是什么,都会发生故障。

public class Page
{
    private EntityRef<Page> _parent = default(EntityRef<Page>);
    private EntitySet<Page> _children = new EntitySet<Page>();

    public int ID { get; set; }
    public string pageTitle { get; set; }
    public string menuTitle { get; set; }
    public string content { get; set; }
    public int listOrder { get; set; }
    public bool visible { get; set; }
    public int parent { get; set; }
    public DateTime? created { get; set; }
    public DateTime? edited { get; set; }
    public string createdBy { get; set; }
    public string lastEditBy { get; set; }
    public string linkInfo { get; set; }
    public bool IsSelected { get; set; }

    public Page Parent
    {
        // return the current entity
        get { return this._parent.Entity; }
        set { this._parent.Entity = value; }
    }

    public EntitySet<Page> Children
    {
        get { return this._children; }
        set { this._children.Assign(value); }
    }

    public static Page Error404()
    {
        return (new Page
        {
            content = "<p>Page not found</p>",
            pageTitle = "404.  Page not found"
        });
    }   
}

这是我尝试的解决方法:

public ActionResult Create([Bind(Exclude="parent")] Page page)
{
    page.parent = Convert.ToInt32(Request.Form["parent"]);
...

我刚刚从 ModelBinding 中排除了下拉列表,并通过 Request.Form 重新加载了它。这是个好习惯吗?

【问题讨论】:

    标签: asp.net-mvc validation drop-down-menu


    【解决方案1】:

    是什么引发了 RuleException?我假设您正在使用某种验证引擎来确定“父”属性是否有效。我会逐步了解为什么会引发此异常。可能该值没有正确传递到您的控制器操作中,或者您的验证规则可能与您认为的不同。

    【讨论】:

    • 就是这样。我根本没有测试父母。它是模型中的一个绑定字段,但没有测试来确定它的有效性。我在想,因为它在 DomainModel 中被定义为 int 并且下拉列表的值始终是一个字符串,这可能是它在绑定期间自动验证失败的原因。
    • 如果是这种情况,如何将 DropDownList 绑定到 int?
    • 您应该粘贴您的 Page 类以便我们可以看到它。它抛出“RuleException”的事实告诉我您正在使用某种验证引擎,当尝试将无效的 Page 对象保存到数据库时会抛出此错误。在这种情况下,您需要弄清楚它违反了什么规则。也许上面有一个最小值/最大值?
    • 是的,当然。对于那个很抱歉。请参阅上面的答案,它不适合评论。
    • 嗯...我仍然不确定 RuleException 是从哪里抛出的。我猜你在 pageRepository.Insert 调用中有验证检查?您是否尝试过介入并查看异常是从哪里引发的?它必须从某个地方抛出,否则您的 ModelState 不会被标记为无效。
    【解决方案2】:

    我最终针对 ModelState["parent"].Value.AttemptedValue 进行了测试,而不是在尝试将字符串放入 int 时无效的实体属性?。

    【讨论】:

    • 我还要提一下我清除模型状态:ModelState.Clear();然后将错误和值添加回原处: ModelState.AddModelError(field, error); ModelState.SetModelValue(field, ValueProvider[field]);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    相关资源
    最近更新 更多