2011-04-13 44 views
0

使用上DropDownListFor驗證有問題...... I'm驗證上DropDownListFor問題(ModelState.IsValid始終爲false)

我的模型:

public class User 
{ 
    ... 
    public virtual int Id{ get; set; } 
    [Required(ErrorMessage = "Required.")] 
    public virtual Role Role { get; set; } 
} 

public class Role 
{   
    public virtual int Id{ get; set; } 
    [Required(ErrorMessage = "Required.")] 
    public virtual string Name { get; set; } 
} 

我的控制器:

public ActionResult Edit() 
    { 
     ViewBag.Roles = new SelectList(new Repository<Role>().GetAll(), "Id", "Name"); 

     return View(); 
    } 

我的編輯視圖(強類型)

@model User 
    ... 
    @Html.LabelFor(model => model.Role) 
    @Html.DropDownListFor(model => model.Role.Id, ViewBag.Roles as SelectList, "-- Select --",new { @class = "form radius" }) 
    @Html.ValidationMessageFor(model => model.Role) 

所有的偉大工程,當我試圖保存用戶模型中的問題被激發:

[HttpPost] 
    public ActionResult Edit(User user) 
    { 
     if (ModelState.IsValid) 
     ... 
    } 

的ModelState.IsValid總是假的... ...展望的ModelState裏面,誤差值在Role.Name鍵...錯誤是:名稱字段是必需的

有沒有什麼辦法解決這個問題?怎麼樣?

感謝

回答

5

你已經把一個必需屬性上Name財產,但這樣你的模型是無效的,這是從來沒有發送到服務器(只有Id張貼)。所以,你應該將它放在Id屬性:

public class Role 
{   
    [Required(ErrorMessage = "Required.")] 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
} 

你也應該讓這個Id屬性Nullable因爲你已經爲你的下拉菜單中定義一個空值,如果用戶不選擇任何值,它會崩潰。所以你的模型應該是這樣的:

public class Role 
{   
    [Required(ErrorMessage = "Required.")] 
    public virtual int? Id { get; set; } 
    public virtual string Name { get; set; } 
} 

你也可以從User類的Role屬性中刪除Required屬性。這不是必需的。

最後的忠告也可能是最重要的一個:讓助手看起來像這樣替換您的視圖模型這ViewBag醜陋與屬性:

@Html.DropDownListFor(
    model => model.Role.Id, 
    Model.Roles, 
    "-- Select --", 
    new { @class = "form radius" } 
) 
+0

問題是我有一個角色UI,用戶可以註冊新的角色......並且需要名稱是必需的,除了我的Id屬性屬於EntityBase類... – Paul 2011-04-13 19:44:28

+0

@Paul然後確保您的表單上有一個名稱輸入字段,並且發送值或您的模型永遠不會有效。如果沒有名稱字段,則使用視圖模型。事實上,不應該,你應該總是使用視圖模型:-) – 2011-04-13 19:45:25

+0

是的,這就是我想要做的,但我不知道如何:( – Paul 2011-04-13 19:47:36

1

我也遇到這樣那樣的錯誤。

也許解決問題的方法是將這樣的代碼在Edit.cshtml視圖:

@ Html.HiddenFor(型號=> model.Id)

0

模型

public class Role 
{   
    [Required(ErrorMessage = "Id Required.")] 
    public virtual int Id { get; set; } 
    [Required(ErrorMessage = "Name Required.")] 
    public virtual string Name { get; set; } 
} 

查看

@Html.DropDownListFor(m => m.Role.Id, (SelectList)ViewBag.gRoles, "-- Select --") 
@Html.ValidationMessageFor(m => m.Role.Id) 

控制器

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Creedit(User x) 
{ 
    x.Role = db.RoseSet.Find(x.Role.Id); 
    if (x.Role != null) 
    { 
     ModelState["Role.Name"].Errors.Clear(); 

    } 

    if (ModelState.IsValid) 
    { 
     // proceed 
    } 
    else 
    { 
     // return validation error 
    } 
} 
相關問題