2009-12-30 100 views
0

下拉列表我的MVC应用程序中有一个下拉列表的表单。现在,我正在尝试为混合添加验证,看起来下拉列表无法验证,无论它的价值是什么。ASP.NET 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回。这是不错的做法吗?

回答

0

我结束了对ModelState [“parent”] .Value.AttemptedValue的测试,而不是在试图将字符串放入int时试图删除的实体属性。

+0

我还应该提到,我清除模型状态: \t \t \t ModelState。明确(); 然后将错误和值添加回原处: \t \t \t ModelState.AddModelError(field,error); \t \t \t ModelState.SetModelValue(field,ValueProvider [field]); – mark123 2010-01-16 13:25:32

0

什么是抛出RuleException?我假设你正在使用某种验证引擎来确定“父”属性是否有效。我会逐步了解为什么抛出这个异常。也许这个价值没有被正确地传递到你的控制器动作中,或者你的验证规则与你认为的不同。

+0

就是这样。我根本没有为父母进行测试。这是模型中的一个绑定字段,但没有测试来确定它的有效性。我在想,因为它在DomainModel中被定义为一个int,并且dropdownlist的值总是一个字符串,可能是它在绑定期间自动验证失败的原因。 – mark123 2009-12-31 00:24:30

+0

如果是这种情况,我如何将一个DropDownList绑定到一个int? – mark123 2009-12-31 00:33:12

+0

你应该粘贴你的Page类,以便我们可以看到它。抛出一个“RuleException”的事实告诉我你正在使用某种验证引擎,当试图将一个无效的页面对象保存到数据库时会引发这种情况。在这种情况下,你需要弄清楚违规的规则。也许有最小值/最大值放置在它上面? – 2009-12-31 01:15:23