2010-09-24 75 views
2

我正在創建一個站點,在該站點中我使用部分視圖來顯示有關單個模型的各種數據位。這是一些HTML。 (請注意,所有這些都包含在一個單一的形式和索引頁,這些諧音在被強類型到主模型渲染中,主模型包含的各種數據列表。)如何從部分視圖獲取模型數據?

<div id="tab1"><% Html.RenderPartial("Tab1", Model); %></div> 
<div id="tab2"><% Html.RenderPartial("Tab2", Model.AnItemList1.FirstOrDefault<AnItemList1>()); %></div> 
<div id="tab3"><% Html.RenderPartial("Tab3", Model.AnItemList2.FirstOrDefault()); %></div> 

這裏是ONE部分視圖標題(對於'tab2'):

<%@ Language="C#" Inherits="System.Web.Mvc.ViewUserControl<AnItem1>" %> 

頁面顯示正確。問題是,當我將數據輸入到部分頁面的各個部分,然後提交整個表單(通過POST)時,數據沒有返回到我的數據存儲(MSSQL) - 但這隻發生在任何列表項(包含在模型中)。第一個部分頁面在數據存儲區中正確設置了其數據集。

我在這裏做錯了什麼?我是否應該只將模型傳遞給Html.RenderPartial,然後在部分頁面上獲取我需要的特定模型?我應該通過整個名單,然後得到第一個(現在,我只關心列表中的第一個項目 - 這將事件發生變化,但不會很快)。

讚賞的建議或想法。

更新:以下是我如何訪問部分視圖的屬性。

<div class="data-group"> 
    <%: Html.CheckBoxFor(model => model.Property1) %> 
    <%: Html.LabelFor(model => model.Property1) %> 
</div> 

更新2:每請求......

控制器動作(ScenarioController):

public ActionResult Index(int id = 0) 
    { 
     if (id == 0) 
     { 
      SavedScenario scenario = new SavedScenario(); 
      scenario.AnItemList1.Add(new AnItem1()); 
      scenario.AnItemList2.Add(new AnItem2()); 
      return View("Index", scenario); 
     } 
     else 
     { 
      SavedScenario scenario = repository.GetScenario(id); 

      if (scenario == null) 
       return View("NotFound"); 
      else 
       return View("Index", scenario); 
     } 
    } 

    [HttpPost] 
    public ActionResult Index(SavedScenario scenario) 
    { 
     if (ModelState.IsValid && TryUpdateModel(scenario, "SaveScenario")) 
     { 
      repository.Add(scenario); 
      repository.Save(); 
     } 

     return View(scenario); 
    } 

渲染HTML(我只能包括它的一部分 - 這是一個小樣本這是什麼形式):

<form action="/Scenario" id="form0" method="post"> 
    <!-- This is the one that works - the basic Scenario. Top level. --> 
    <fieldset> 
    <legend>Scenario Information</legend> 

    <div class="data-group"> 
     <div class="editor-label"> 
      <label for="ScenarioName">Scenario Name</label> 

     </div> 
     <div class="option1"> 
      <input class="wide" id="ScenarioName" name="ScenarioName" type="text" value="" /> 
     </div> 
     <div class="validation"> 
      <div><span class="field-validation-valid" id="ScenarioName_validationMessage"></span></div> 
     </div> 
    </div> 
    </fieldset> 

<!-- This does not work or get submitted (as far as I can tell). --> 
<div id="tab2"> 
<fieldset> 
    <legend>Tab2</legend> 
    <div class="data-group"> 
     <input id="Property1" name="Property1" type="checkbox" value="true" /><input name="Property1" type="hidden" value="false" /> 
     <label for="Property1" /> 
    </div> 
</div> 
</fieldset> 

</form> 

我的道歉因爲必須保持這種通用性。

回答

1

很難從這麼多的代碼猜測。然而,你應該確保你的模型的所有屬性都當他們回發到服務器

編輯相同的前綴:表單字段名稱應該與模型的屬性名稱正確綁定的所有值。您有兩個名稱相同的字段,您可以按以下方式進行綁定:

[HttpPost] 
    public ActionResult Index(SavedScenario scenario, List<bool> Property1) 
    { 
     // here you can do with values coming in property1 
     if (ModelState.IsValid && TryUpdateModel(scenario, "SaveScenario")) 
     { 
      repository.Add(scenario); 
      repository.Save(); 
     } 

     return View(scenario); 
    } 
+0

我不完全確定您的意思。你能發佈其他信息嗎? (我也更新了一下我的問題。)謝謝。 – JasCav 2010-09-24 18:04:48

+0

可以粘貼你的控制器動作和html在瀏覽器中呈現 – 2010-09-24 18:33:53

+0

根據你的請求更新。感謝您的幫助。 – JasCav 2010-09-24 18:59:24

0

這可能是命名部分表單上的字段的問題。嘗試命名部分視圖上的字段,並在其前加上傳入的模型的名稱......例如'AnItemList1.name'而不是'name' ..我只是在這裏猜測......但這就是我有時需要解決的問題當我得到值爲空...