2013-03-13 93 views
24

是否有結合項視圖的一個IList的圖案。我似乎有問題與HttpPost。我知道菲爾哈克寫了一篇很好的文章,但它是過時,他說,他們可能會與MVC 4模型綁定到一個List MVC 4

+0

請考慮添加更多細節,包括相關螞蟻代碼和鏈接到你的問題,使其更清晰。這裏有一個很好的清單讓你開始:http://tinyurl.com/so-list – mellamokb 2013-03-13 02:09:52

+0

將列表綁定到視圖。什麼不清楚這個? – Karthik 2013-03-13 02:17:49

+1

根據您的表單看起來有些變化。一些查看代碼會有所幫助。 – AaronLS 2013-03-13 02:17:53

回答

46

修復這是我要做的事,如果我需要爲每個項目顯示的形式,以及各種屬性的輸入。真的取決於我想要做什麼。

視圖模型看起來是這樣的:

public class MyViewModel 
{ 
    public List<Person> Persons{get;set;} 
} 

查看(當然,BeginForm):

@model MyViewModel 


@for(int i = 0; i < Model.Persons.Count(); ++i) 
{ 
    @Html.HiddenFor(m => m.Persons[i].PersonId) 
    @Html.EditorFor(m => m.Persons[i].FirstName) 
    @Html.EditorFor(m => m.Persons[i].LastName)   
} 

操作:

[HttpPost]public ViewResult(MyViewModel vm) 
{ 
... 

注意,在回傳僅其中有輸入性可用將有價值。也就是說,如果Person具有.SSN屬性,那麼在後置操作中將不可用,因爲它不是表單中的字段。

注意的方式MVC模型結合的作品,它只會看連續的ID。因此,在有條件地隱藏項目的情況下做這樣的事情會導致它在第五項後不綁定任何數據,因爲一旦它在ID中遇到間隙,它就會停止綁定。即使有10個人,你只會在回發拿到第4:

@for(int i = 0; i < Model.Persons.Count(); ++i) 
{ 
    if(i != 4)//conditionally hide 5th item, 
    { //but BUG occurs on postback, all items after 5th will not be bound to the the list 
     @Html.HiddenFor(m => m.Persons[i].PersonId) 
     @Html.EditorFor(m => m.Persons[i].FirstName) 
     @Html.EditorFor(m => m.Persons[i].LastName)   
    } 
} 
+1

我使用mvc 5.1而不是'++ 1',我不得不這樣做:'@ {++ i; },在'@foreach()'塊內。 – Yustme 2014-03-03 15:58:25

+0

@Yustme也許,如果你有HTML標籤,也許會出現這種情況,你需要'@ {}'將該上下文切換回C#代碼。但好的提示無論哪種方式。 – AaronLS 2014-03-05 08:44:02

+5

聲明「我」,然後使用foreach是非常醜陋的,特別是當我們有FOR LOOPS時。除非你確實需要,否則請不要使用特定的List實現。 – 2014-04-14 16:21:18

3

〜控制器

namespace ListBindingTest.Controllers 
{ 
    public class HomeController : Controller 
    { 
     // 
     // GET: /Home/ 

     public ActionResult Index() 
     { 
      List<String> tmp = new List<String>(); 
      tmp.Add("one"); 
      tmp.Add("two"); 
      tmp.Add("Three"); 
      return View(tmp); 
     } 

     [HttpPost] 
     public ActionResult Send(IList<String> input) 
     { 
      return View(input); 
     }  
    } 
} 

〜強類型的索引視圖

@model IList<String> 

@{ 
    Layout = null; 
} 

<!DOCTYPE html> 

<html> 
<head> 
<meta name="viewport" content="width=device-width" /> 
<title>Index</title> 
</head> 
<body> 
    <div> 
    @using(Html.BeginForm("Send", "Home", "POST")) 
    { 
     @Html.EditorFor(x => x) 
     <br /> 
     <input type="submit" value="Send" /> 
    } 
    </div> 
</body> 
</html> 

〜強類型發送查看

@model IList<String> 

@{ 
    Layout = null; 
} 

<!DOCTYPE html> 

<html> 
<head> 
<meta name="viewport" content="width=device-width" /> 
<title>Send</title> 
</head> 
<body> 
    <div> 
    @foreach(var element in @Model) 
    { 
     @element 
     <br /> 
    } 
    </div> 
</body> 
</html> 

這就是你不得不做的一切,將他的MyViewModel模型改爲IList。

+0

史蒂夫,感謝您的信息,這工作正常。我的問題,也許我沒有解釋是綁定一個動態列表。桑德森釘在這篇文章http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/ – Karthik 2013-03-13 03:36:44

+0

@JT沒關係,如果我在控制器中靜態鍵入列表,或者從數據庫或文件中獲取它。列表來自哪裏與模型綁定無關。 – 2013-03-13 03:38:11

+1

我的問題是與HttpPost。當視圖中的對象列表發生更改時,值不會正確發佈。這就是桑德森所說的,我正在使用他的方法。 MVC團隊知道這一點,Sanderson的方法是我見過的最好的方法。我向所有人道歉,因爲不清楚。 – Karthik 2013-03-13 04:02:10

6

一個乾淨的解決方案是創建一個通用類來處理列表中,這樣你就不會需要創建一個不同的類中每個需要它的時候。

public class ListModel<T> 
{ 
    public List<T> Items { get; set; } 

    public ListModel(List<T> list) { 
     Items = list; 
    } 
} 

,當你返回查看你只需要簡單地做:

List<customClass> ListOfCustomClass = new List<customClass>(); 
//Do as needed... 
return View(new ListModel<customClass>(ListOfCustomClass)); 

然後在模型中定義的列表:

@model ListModel<customClass> 

,並準備去:

@foreach(var element in Model.Items) { 
    //do as needed... 
}