2015-12-22 87 views
-1

我正在重構一個MVC項目中使用動作過濾器來執行PRG清理控制器(後重定向-GET)時ModelState是無效的,並在在TempData存儲ModelState重定向。顯示從數據集合中的ModelState

我有一個看起來是這樣的視圖模型:

public class GroupMember 
{ 
    public string UserId { get; set; } 
    public bool SendNotifications { get; set; } 
} 

public class Group 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    // ... 
    public List<GroupMember> Members { get; set; } 
} 

控制器操作:

[HttpGet] 
[ImportModelState] 
public ActionResult Create() 
{ 
    var model = new Group(); 
    return View(model); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
[ValidateModelState] 
public ActionResult Create(
    [Bind(Exclude = "Id")] 
    Group model) 
{ 
    // call service to save 
    // ... 
} 

我在與獲得集合Group.Members到重定向後正確顯示的問題。 ModelState已正確加載100%,並且對於像Group.Name這樣的屬性正常工作,其中調用到Html.EditorFor(...)加載的數據來自ModelState而不是使用(空)模型。

我有GroupMember編輯模板(這在所有工作正常,但重定向的情況),並正在顯示使用Html.EditorFor(model => model.Members)收集,但顯然MVC確實檢查ModelState在這種情況下,所以它始終顯示一個空列表。

有沒有一種乾淨的方法來解決這個問題?我想我應該能夠將隱藏字段中的成員數量存儲起來,然後手動檢查它是否具有ModelState中的值,但這似乎是一種笨拙的解決方法。

編輯: 我已經想出瞭解決方法是將一個屬性添加到NumMembersGroup,並插入以下到Razor視圖:

@{ 
    ModelState state; 
    var numMembers = ViewData.ModelState.TryGetValue("NumMembers", out state) 
    ? int.Parse(state.Value.AttemptedValue) 
    : Model.Members.Count; 

    if (numMembers != Model.Members.Count) 
    { 
    Model.Members = Enumerable.Repeat(new GroupMember(), numMembers).ToList(); 
    } 
} 
@Html.HiddenFor(model => model.NumMembers) 
@Html.EditorFor(model => model.Members) 

我,修正了項指標進行適當的JavaScript代碼模型綁定在發佈之前更新NumMembers隱藏字段。仍然希望有一個更清潔的解決方案。

+0

你正確使用它嗎? http://cpratt.co/html-editorfor-and-htmlattributes/ http://www.pearson-and-steel.co.uk/how-to-use-the-html-editorfor-method/ – MaxOvrdrv

+0

@MaxOvrdrv這些文章與我的問題 – Merad

+0

幾乎沒有任何關係,只是確保你在這裏使用了正確的幫手......很多人都沒有,而且它造成了很多問題。這是一個完美的例子,對我來說,這似乎與你的問題有關。 http://stackoverflow.com/questions/7414351/mvc-3-html-editorfor-seems-to-cache-old-values-after-ajax-call – MaxOvrdrv

回答

0

沒有簡單的解決方法。你應該使用隱藏的領域。