2012-10-15 38 views
2

任何人都可以請我看看按鈕上的列表發佈代碼點擊從視圖到mvc3-asp中的控制器。我有一個列表,其中一個列表元素是複選框。首先,我必須從列表中選擇一些值,然後將其提交以僅保存選定的值。從視圖中提交一個列表到控制器

回答

4

您的問題有兩個廣泛的答案。所以我會給你一個通用的例子,你需要根據你的場景進行定製。

假設你的觀點是分配一些任務給用戶。每個用戶可以分配到一個或多個任務。

所以我會創建一個像這樣的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來處理表單提交的集合。這篇文章展示了一個處理單選按鈕的例子。

+0

如果您包含對象的列表索引和PrimaryKey/ForeignKey,而不需要在POST控制器操作中手動重建,則Razor將重建ListOf/Enumrations。有點隱藏的寶石 - 但也MVC不是這樣工作的,因爲每個實體應該單獨編輯自己的形式和視圖。但是......顯然有很好的用例證明了這個需要...... – ppumkin

4

您實際上可以跳過控制器中的所有重建。 Razor可以使用單個表單重建任何對象的列表。您只需要回退到舊的for並分配一個唯一的名稱,幷包含該集合的主鍵。

在回發剃鬚刀會重建您的ViewModel修改列表沒有任何額外的工作。

enter image description here

在標記它看起來是這樣的

enter image description here

而且在回發模式後的控制器與新的數據重建的用戶輸入,並且還lazyBound到ForeignKey模型!

enter image description here

使用複選框或單選投入它的略有不同。問題是,當一個複選框沒有打勾時,瀏覽器不會提交它,模型也不會重建。這不是VS的一個缺點,而是一個HTML1的預期實現,它仍然存在於HTML5中!

如果發生這種情況,將出現指數超出界限。因此,您在輸入框之前包含一個值爲false的複選框的隱藏字段(如果用戶選中它,它將覆蓋false爲true)

但是,如果您使用的是StronglyTyped模型,任何評估爲null的複選框都會自動設置爲false,這被稱爲C#規範中定義的布爾值的默認值。

+1

這應該是答案,即時通訊使用mvc 4,並且所選答案對我無效。這完全適合 –

+0

我很高興它爲你工作。它是您可以使用的那些隱藏的寶石或高級技術之一。你不能接受答案,但如果它對你有幫助,請投票。謝謝 – ppumkin

+0

我意外地低估了這個問題,所以任何看着這個問題的人,我都覺得沒有什麼是錯的,只是忽略了! – RoguePlanetoid

相關問題