我正在重構一個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
中的值,但這似乎是一種笨拙的解決方法。
編輯: 我已經想出瞭解決方法是將一個屬性添加到NumMembers
Group
,並插入以下到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隱藏字段。仍然希望有一個更清潔的解決方案。
你正確使用它嗎? http://cpratt.co/html-editorfor-and-htmlattributes/ http://www.pearson-and-steel.co.uk/how-to-use-the-html-editorfor-method/ – MaxOvrdrv
@MaxOvrdrv這些文章與我的問題 – Merad
幾乎沒有任何關係,只是確保你在這裏使用了正確的幫手......很多人都沒有,而且它造成了很多問題。這是一個完美的例子,對我來說,這似乎與你的問題有關。 http://stackoverflow.com/questions/7414351/mvc-3-html-editorfor-seems-to-cache-old-values-after-ajax-call – MaxOvrdrv