2012-01-05 34 views
1

我正在使用包含一些其他模型(實體)爲每個局部視圖的視圖模型。 我通過傳遞ViewModel中的實體來渲染局部視圖。我的部分視圖有幾個字段和一些按鈕。在點擊按鈕(這是我的局部視圖內)表單被張貼回來的數據在一個子實體,而我的viewmodel始終回發爲空... 我需要的數據出現在我的viewmodel發回。在回發模型和視圖模型內丟失數據在回發

所有視圖是強類型:

代碼:

public class OrdersVM 
{ 
    public FiltersVM filterCriteria { get; set; } 
    public IEnumerable<MeterInventory> meters { get; set; } 
    public string assignTo { get; set; } 
    public IEnumerable<SelectListItem> AssigneeOptions { get; set; } 
} 

public partial class Meters 
{ 
    public int MTRNO { get; set; } 
    public string LOCName { get; set; } 
} 

public class FiltersVM 
{ 
    public string Center { get; set; } 
    public DateTime? DueDate { get; set; } 
} 

查看代碼

@model OrdersVM 
@{ 
    ViewBag.Title = "Orders"; 
} 
@using (Html.BeginForm()) 
{ 
    <div> 
     @Html.Partial("~/Views/Base/Filters.cshtml", Model.filterCriteria) 
    </div> 
    @foreach (var item in Model.meters) 
    { 
    <table> 
     <tr> 
      <td> 
       @Html.Encode(item.LOCNAME) 
      </td> 
     </tr> 
    </table> 
    } 
} 

控制器代碼

[HttpPost] 
public ActionResult Index(OrdersVM orders, FiltersVM filters) 
{ 
    //orders is null 
    //filters has values 
} 

感謝Olivehour。我正在使用部分視圖「Filters.cshtml」。並呈現相同。

下面是局部視圖的代碼:

@model ViewModels.FiltersVM <fieldset> 
    <legend>Order Assignment</legend> 
    <table id="tbl1" class="tableforcontrols"> 
     <tr> 
      <td> 
       <div class="editor-label"> 
        @Html.LabelFor(model => model.LDC) 
       </div> 
      </td> 
      <td> 
       <div class="editor-field"> 
        <input type="submit" value="Search" id="btnSearch" name="button" /> 
       </div> 
      </td> 
      <td> 
       <div class="editor-field"> 
        <input type="submit" class="cancel" value="Reset" id="btnReset" name="button" /> 
       </div> 
      </td> 
     </tr> 
    </table> </fieldset>  

我與單個參數「OrdersVM」(父視圖模型)嘗試,但沒有運氣。

[HttpPost] 
public ActionResult Index(OrdersVM orders) 

但如果我的父視圖模型傳遞給它被保持在OrdersVM.filterCriteria但不適合特性的數據(IEnumerable的米,串assignTo和可數AssigneeOptions)

@Html.Partial("~/Views/Base/Filters.cshtml", Model) 

我的局部視圖新的MVC。請讓我知道是否有人找到解決方案。

在此先感謝。

回答

0

看起來你在這裏有幾個問題。在您的操作方法中爲什麼命令arg爲null的一個可能的原因是因爲它看起來不像是在渲染任何輸入元素。你只需要@Html.Encode(item.LOCNAME)

爲了使默認的模型聯編程序構造一個OrdersVM實例並將其傳遞給action方法,它需要從HTTP POST輸入。你需要更多的東西,如@Html.TextBoxFor(m => item.LOCNAME)

我認爲的第二個問題是,在操作方法中有2個參數。由於OrdersVM已具有FiltersVM屬性,因此您應該只能擁有對動作方法的單個OrdersVM參數。在HTTP POST期間,您只能訪問OrdersVM.filterCriteria中的FiltersVM屬性。但這會導致你的第三項挑戰,因爲OrdersVM上的meters屬性是IEnumerable集合。

爲了解決這個問題,首先有幾個讀數this article about model binding collections。這是舊的,但它仍然適用於MVC3。閱讀它,並真正包圍它的頭。

如果您不喜歡使用整數來索引您的收集字段,則有一個HTML helper written by Steve Sanderson,它允許您使用GUID索引收集輸入。我們一直都在使用它,但這可能會非常棘手 - 主要是,您應始終將收集項目置於局部視圖中。就目前而言,如Haacked文章中所述,使用基於整數的索引可能會更好。

+0

感謝Olivehour。我會嘗試通過鏈接...我已更新我的問題,請看看。 – HKGR 2012-01-05 09:03:40

+0

任何更新? – HKGR 2012-01-05 11:01:53

0

這聽起來像你從Webforms來的。要轉換到MVC,您需要刪除PostBack的想法。這是網絡上並不存在的概念,但Webform爲我們僞造了這個概念。

在MVC中,你通常以GET請求開始,比如/ edit/{someId}。從這裏您可以從數據庫加載視圖模型的數據並呈現視圖。現在讓我們說,視圖模型中的所有數據都是可編輯的,因此每個屬性都有自己的輸入字段。用戶編輯一些數據並保存表單。這會向服務器發佈POST。

假設我們有這樣的POST方法

[HttpPost] 
public ActionResult Edit(MyViewModel model) 

在這種情況下,你擁有你所需要modelbinded因爲形式存在的所有數據的數據。

您可以這樣做,並獲得相同的視圖,因爲所有數據都是數據綁定的。

[HttpPost] 
public ActionResult Edit(MyViewModel model){ 
    return View(model); 
} 

現在讓我們假裝你的表單中有一個下拉菜單。然後你的viewmodel中會有這兩個屬性。

public int CarId { get; set; } 
public IEnumerable<SelectListItem> CarOptions {get; set; } 

當您張貼的形式此時CarId將在視圖模型,因爲它們不是表單數據的一部分來填充,但不CarOptions。如果您想要再次返回相同的視圖,您所做的是重新加載缺失的部分。

[HttpPost] 
public ActionResult Edit(MyViewModel model){ 
    model.CarOptions = LoadCarOptions(); 
    return View(model); 
} 

如果將它放在隱藏字段中,也可以模擬綁定。但是再次從服務器/數據庫重新加載它更容易,可能更有效。這是使用MVC時採用的常規方法。