2012-05-30 261 views
4

我在ASP.NET MVC中遇到麻煩,並將數據從View傳遞到Controller。我有這樣一個模型:ASP.NET MVC,將模型從視圖傳遞到控制器

public class InputModel { 
    public List<Process> axProc { get; set; } 

    public string ToJson() { 
    return new JavaScriptSerializer().Serialize(this); 
    } 
} 

public class Process { 
    public string name { get; set; } 
    public string value { get; set; } 
} 

我在控制器創建這個InputModel並將它傳遞給視圖:

public ActionResult Input() { 
    if (Session["InputModel"] == null) 
    Session["InputModel"] = loadInputModel(); 
    return View(Session["InputModel"]); 
} 

在我Input.cshtml文件,然後我有一些代碼來生成輸入形式:

@model PROJ.Models.InputModel 

@using(Html.BeginForm()) { 
    foreach(PROJ.Models.Process p in Model.axProc){ 
    <input type="text" /> 
    @* @Html.TextBoxFor(?? => p.value) *@ 
    } 
    <input type="submit" value="SEND" /> 
} 

現在,當我點擊提交按鈕時,我想處理放入文本框的數據。

問題1:我看過這個@ Html.TextBoxFor(),但我沒有真正得到這個「stuff => otherstuff」。我的結論是,「其他人」應該是我想要寫入數據的領域,在這種情況下,它可能是「p.value」。但是箭頭前面的「東西」是什麼?

早在控制器然後我有一些調試的自檢功能:

[HttpPost] 
public ActionResult Input(InputModel m) { 
    DEBUG(m.ToJson()); 
    DEBUG("COUNT: " + m.axProc.Count); 

    return View(m); 
} 

這裏的調試只能說明是這樣的:

{"axProc":[]} 
COUNT: 0 

,返回的模型我得到的是空的。

問題2:我對這個@using(Html.BeginForm())做了一些根本性的錯誤嗎?這在這裏不是正確的選擇嗎?如果是這樣,我怎麼讓我的模型充滿數據回控制器?
(我不能用「@model名單<過程>」在這裏(因爲上面的例子中的簡稱,在實際的代碼將有更多的東西)。)

我希望有人能填補我在與一些我忽略的細節。

+1

您需要了解什麼是lambda表達式。 – SLaks

+0

我現在做過。感謝您的名字。 – Cabadath

回答

2

將您的視圖更改爲這樣的一些東西,以正確綁定表單提交上的列表。

@using(Html.BeginForm()) { 
    for(int i=0;i<Model.axProc.Count;i++){ 
    <span> 
    @Html.TextBoxFor(model => model.axProc[i].value) 
</span> 
    } 
    <input type="submit" value="SEND" /> 
} 
+1

謝謝,這工作正常。另外一個問題是更多的圖層,您必須將它們定義爲屬性({get; set;}),而不是字段,否則它不能按預期工作。 – Cabadath

0
  1. In @ Html.TextBoxFor(stuff => otherstuff)stuff是你的View的模型,otherstuff是你模型的公共成員。
  2. 由於在View中想要爲集合類型(List)的模型成員呈現輸入元素,因此應首先爲呈現該集合的單個項目(Process)創建單獨的局部視圖。它會是這個樣子(命名爲Process.cshtml,例如,並將其放置到/查看/共享文件夾):

    @model List<PROJ.Models.Process> 
    
    @Html.TextBoxFor(model => p.value) 
    

然後,你的主視圖應該是這樣的:

@model PROJ.Models.InputModel 

@using(Html.BeginForm()) { 
    foreach(PROJ.Models.Process p in Model.axProc){ 
    @Html.Partial("Process", p) 
    } 
    <input type="submit" value="SEND" /> 
} 

另外,請檢查loadInputModel()方法是否實際返回某些內容,例如不是一個空的列表。

+0

loadInputModel()確實返回了一些東西,頁面被正確渲染(如果它是空的,情況不會如此)。但只是將這些東西放在部分視圖中並不能解決問題,請參閱tsegay的解決方案。 – Cabadath

相關問題