任何人都可以請我看看按鈕上的列表發佈代碼點擊從視圖到mvc3-asp中的控制器。我有一個列表,其中一個列表元素是複選框。首先,我必須從列表中選擇一些值,然後將其提交以僅保存選定的值。從視圖中提交一個列表到控制器
回答
您的問題有兩個廣泛的答案。所以我會給你一個通用的例子,你需要根據你的場景進行定製。
假設你的觀點是分配一些任務給用戶。每個用戶可以分配到一個或多個任務。
所以我會創建一個像這樣的viewmodel。
public class UserViewModel
{
public int UserId { set;get;}
public string Name { set;get;}
public List<Task> Tasks { set;get;}
public UserViewModel()
{
Tasks=new List<UserTask>();
}
}
public class UserTask
{
public int ID { set;get;}
public string Name { set;get;}
public bool IsSelected { set;get;}
}
現在,在您GET
行動,創建UserViewModel的目標和任務屬性設置爲可用TAKS的列表(從您的數據庫而定)
public ActionResult Add()
{
var vm=new UserViewModel();
vm.Tasks=GetAvailableTasks();
return View(vm);
}
假設GetAvailableTasks
是一種方法,返回一個UserTask
對象的列表。
現在創建一個編輯器模板。轉到您的~/Views/YourControllerName
文件夾並創建一個名爲EditorTemplates
的文件夾。將新視圖添加到新創建的文件夾並命名爲Task.cshtml
。下面的代碼添加到
@model YourNameSpace.UserTask
<p>
@Html.CheckBoxFor(x => x.IsSelected) Model.Name
@Html.HiddenFor(x => x.ID)
</p>
現在回到你的主要觀點,並使用EditorFor
helper方法帶來的EditorTemplate。
@model YourNamespace.UserViewModel
<h2>Quiz 24</h2>
@using (Html.BeginForm())
{
@Html.EditorFor(x=>x.Tasks)
<input type="submit" />
}
現在,當表單被提交,你可以得到這樣
[HttpPost]
public ActionResult Save(UserViewModel model)
{
List<int> taskIds=new List<int>();
foreach (var task in model.Tasks)
{
if (task.IsSelected)
{
//you can get the selected task id's here.
taskIds.Add(task.ID);
}
}
//to do : save and redirect (PRG pattern)
}
Here選擇複選框值是博客文章,解釋瞭如何使用EditorTemplates來處理表單提交的集合。這篇文章展示了一個處理單選按鈕的例子。
您實際上可以跳過控制器中的所有重建。 Razor可以使用單個表單重建任何對象的列表。您只需要回退到舊的for
並分配一個唯一的名稱,幷包含該集合的主鍵。
在回發剃鬚刀會重建您的ViewModel
修改列表沒有任何額外的工作。
在標記它看起來是這樣的
而且在回發模式後的控制器與新的數據重建的用戶輸入,並且還lazyBound到ForeignKey模型!
使用複選框或單選投入它的略有不同。問題是,當一個複選框沒有打勾時,瀏覽器不會提交它,模型也不會重建。這不是VS的一個缺點,而是一個HTML1的預期實現,它仍然存在於HTML5中!
如果發生這種情況,將出現指數超出界限。因此,您在輸入框之前包含一個值爲false的複選框的隱藏字段(如果用戶選中它,它將覆蓋false爲true)
但是,如果您使用的是StronglyTyped模型,任何評估爲null的複選框都會自動設置爲false,這被稱爲C#規範中定義的布爾值的默認值。
這應該是答案,即時通訊使用mvc 4,並且所選答案對我無效。這完全適合 –
我很高興它爲你工作。它是您可以使用的那些隱藏的寶石或高級技術之一。你不能接受答案,但如果它對你有幫助,請投票。謝謝 – ppumkin
我意外地低估了這個問題,所以任何看着這個問題的人,我都覺得沒有什麼是錯的,只是忽略了! – RoguePlanetoid
- 1. 提交表單視圖到控制器
- 2. 不能提交二維`列表`從視圖到控制器
- 3. 將從Cloudkit提取的數據從一個視圖控制器傳遞到另一個視圖控制器
- 4. 從一個表視圖控制器傳遞json id到swift 3中的另一個表視圖控制器3
- 5. 發送對象的列表從視圖到控制器上提交
- 6. 從另一個視圖控制器關閉視圖控制器
- 7. 從另一個視圖控制器通知視圖控制器
- 8. 如何從一個表視圖控制器導航到另一個表視圖控制器在Xcode
- 9. 頁面視圖控制器 - 從圖像到另一個視圖控制器
- 10. 從一個表視圖實例化多個視圖控制器
- 11. 從一個視圖控制器添加對象到另一個視圖控制器上的陣列
- 12. 傳遞從根視圖控制器消息到另一個視圖控制器
- 13. 將數據從視圖控制器傳遞到另一個視圖控制器
- 14. 從解析到表格視圖控制器中提取數據
- 15. 如何在一個鏈中從一個視圖控制器切換到另一個視圖控制器
- 16. 無法將數據從一個視圖控制器推送到一個表視圖控制器
- 17. 多個控制器從一個視圖
- 18. 提交從jsp到控制器的對象列表
- 19. 試圖從故事板中的一個視圖控制器轉到另一個視圖控制器
- 20. 從一個UITableView控制器切換到視圖 - 控制
- 21. 從另一個視圖控制器添加對象到陣列
- 22. 從一個視圖控制器模式切換到另一個視圖控制器後,視圖完全黑色
- 23. 從一個控制器視圖到另一個控制器視圖的ASP.NET MVC 3 Razor渲染部分視圖
- 24. 從視圖到控制器
- 25. 從控制器到視圖
- 26. 提交一個表單到多個控制器
- 27. 在一個又一個視圖控制器設置變量,並交換到該視圖控制器
- 28. 如何從視圖到另一個視圖控制器(iphone)
- 29. 表視圖單元格到另一個視圖控制器
- 30. 從另一個視圖控制器中刪除視圖控制器
如果您包含對象的列表索引和PrimaryKey/ForeignKey,而不需要在POST控制器操作中手動重建,則Razor將重建ListOf/Enumrations。有點隱藏的寶石 - 但也MVC不是這樣工作的,因爲每個實體應該單獨編輯自己的形式和視圖。但是......顯然有很好的用例證明了這個需要...... – ppumkin