2009-12-30 125 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