2010-10-16 51 views
2

問候每個人,多次渲染局部視圖時的模型綁定(局部視圖用於編輯)

我對用作編輯窗體的局部視圖有點麻煩。除了表單中隱藏的元素外,模型在傳遞給我的EditContact後控制器時爲空。

我應該補充一點,我意識到有一種更加無縫的方式來做我正在使用AJAX所做的事情,但我認爲如果我能先解決笨重的方法,它會幫助我更好地理解這種方法。 這裏是我的EditContact局部視圖:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<WebUI.DataAccess.CONTACT>" %> 
<div id="contactPartial-<%= ViewData.Model.id %>"> 
    <% Html.EnableClientValidation(); %> 
    <% using (Html.BeginForm("EditContact", "Investigator")) 
     { %> 
    <%= Html.HiddenFor(Model => Model.id) %> 
    <%= Html.HiddenFor(Model => Model.investId) %> 
    <table id="EditContact-<%= ViewData.Model.id %>" width="100%"> 
     <tr> 
      <th colspan="4"> 
       <b>New Contact</b> 
      </th> 
     </tr> 
     <tr> 
      <td> 
       <b> 
        <%= Html.LabelFor(Model => Model.type)%></b><br /> 
       <%= Html.EditorFor(Model => Model.type, null, "contactType-" + ViewData.Model.id)%><br /> 
       <%= Html.ValidationMessageFor(Model => Model.type) %> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <b> 
        <%= Html.LabelFor(Model => Model.salutation)%></b><br /> 
       <%= Html.EditorFor(Model => Model.salutation, null, "contactsalutation-"+ViewData.Model.id)%> 
      </td> 
      <td> 
       <b> 
        <%= Html.LabelFor(Model => Model.firstName)%></b><br /> 
       <%= Html.EditorFor(Model => Model.firstName, null, "contactFirstName-"+ViewData.Model.id)%> 
      </td> 
      <td> 
       <b> 
        <%= Html.LabelFor(Model => Model.middleName)%></b><br /> 
       <%= Html.EditorFor(Model => Model.middleName, null, "contactMiddleName-"+ViewData.Model.id)%> 
      </td> 
      <td> 
       <b> 
        <%= Html.LabelFor(Model => Model.lastName)%></b><br /> 
       <%= Html.EditorFor(Model => Model.lastName, null, "contactLastName-"+ViewData.Model.id)%><br /> 
       <%= Html.ValidationMessageFor(Model => Model.lastName)%> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <b> 
        <%= Html.LabelFor(Model => Model.title)%></b><br /> 
       <%= Html.EditorFor(Model => Model.title, null, "contactTitle-"+ViewData.Model.id)%> 
      </td> 
      <td> 
       <b> 
        <%= Html.LabelFor(Model => Model.phone)%></b><br /> 
       <%= Html.EditorFor(Model => Model.phone, null, "contactPhone="+ViewData.Model.id)%> 
      </td> 
      <td> 
       <b> 
        <%= Html.LabelFor(Model => Model.altPhone)%></b><br /> 
       <%= Html.EditorFor(Model => Model.altPhone, null, "contactAltPhone-" + ViewData.Model.id)%> 
      </td> 
      <td> 
       <b> 
        <%= Html.LabelFor(Model => Model.fax)%></b><br /> 
       <%= Html.EditorFor(Model => Model.fax, null, "contactFax-" + ViewData.Model.id)%> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <b> 
        <%= Html.LabelFor(Model => Model.email)%></b><br /> 
       <%= Html.EditorFor(Model => Model.email, null, "contactEmail-" + ViewData.Model.id)%> 
      </td> 
      <td> 
       <b> 
        <%= Html.LabelFor(Model => Model.comment)%></b><br /> 
       <%= Html.EditorFor(Model => Model.comment, null, "contactComment-" + ViewData.Model.id)%> 
      </td> 
      <td> 
      </td> 
      <td> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <input type="submit" value="Save" /> 
      </td> 
      <td> 
       <button id="<%= ViewData.Model.id %>" class="contactEditHide"> 
        Cancel</button> 
      </td> 
      <td> 
      </td> 
      <td> 
      </td> 
     </tr> 
    </table> 
    <% } %> 
</div> 

當編輯聯繫人後控制器通過模型只ID和investId具有價值;其他一切都是空的。下面是我如何呈現在我詳細的局部視圖中查看:

<table width="100%"> 
    <tr> 
     <th colspan="7"> 
      <b>Contacts</b> 
     </th> 
     <th id="contactButton" class="button"> 
      <button id="showEditContact-0" type="button" class="contactEditShow">New Contact</button> 
     </th> 
    </tr> 
    <tr> 
     <th> 
      Type 
     </th> 
     <th> 
      Name 
     </th> 
     <th colspan="2"> 
      Title 
     </th> 
     <th> 
      Prim. & Alt. Phone 
     </th> 
     <th> 
      Fax 
     </th> 
     <th colspan="2"> 
      Comment 
     </th> 
    </tr> 
    <% for (int i = 0; i < Model.CONTACTs.Count; i++) 
     { %>   
    <tr id="contactRow-<%= Model.CONTACTs[i].id %>" class="contactRow"> 
     <td> 
      <%= Html.Encode(Model.CONTACTs[i].type)%> 
     </td> 
     <td> 
      <%= Html.Encode(Model.CONTACTs[i].salutation)%> 
      <%= Html.Encode(Model.CONTACTs[i].firstName)%> 
      <%= Html.Encode(Model.CONTACTs[i].middleName)%> 
      <%= Html.Encode(Model.CONTACTs[i].lastName)%> 
      <br /> 
      <a href="mailto:<%= Html.AttributeEncode(Model.CONTACTs[i].email) %>"> 
       <%= Html.Encode(Model.CONTACTs[i].email)%></a> 
     </td> 
     <td colspan="2"> 
      <%= Html.Encode(Model.CONTACTs[i].title)%> 
     </td> 
     <td> 
      Prim:<%= Html.Encode(Model.CONTACTs[i].phone)%><br /> 
      Alt:<%= Html.Encode(Model.CONTACTs[i].altPhone)%> 
     </td> 
     <td> 
      <%= Html.Encode(Model.CONTACTs[i].fax)%> 
     </td> 
     <td> 
      <%= Html.Encode(Model.CONTACTs[i].comment)%> 
     </td> 
     <td> 
      <button id="<%= Model.CONTACTs[i].id %>" type="button" class="contactEditShow">Edit Contact</button> 
     </td> 
    </tr> 
    <tr> 
     <td colspan="8"> 
      <% Html.RenderPartial("EditContact", Model.CONTACTs[i]); %> 
     </td> 
    </tr> 
    <% } %> 
</table> 

我的詳細信息查看強烈tyed到調查員的模型:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<WebUI.DataAccess.INVESTIGATOR>" %> 

正如你可以在上面看到,我的部分觀點是強烈鍵入到CONTACTS模型。

我遇到了模型綁定的類似問題,在視圖中,我試圖允許一次編輯地址的所有圖層,並通過建立索引模型來修復它,類似於上面的Details視圖。似乎我需要在我的部分視圖中做同樣的事情來確保模型綁定,但我不知道如何實現這一點(有語法問題)。

當然,我可能在這裏需要一個新的解決方案! 讓我知道你是否需要更多細節!謝謝!

回答

4

你爲什麼要使用

<%= Html.EditorFor(Model => Model.salutation, null, "contactsalutation-"+ViewData.Model.id)%> 

如果你使用它只是這樣

<%= Html.EditorFor(Model => Model.salutation) %>

應該工作。

爲了映射您的模型,您的控件需要具有與該名稱相同的id,並且您使用的第三個參數會更改您的控件ID。

+0

呃...有趣!這工作。我會將其標記爲已回答。我正在重命名這些ID,以便它們是唯一的。例如,當需要輸入新的聯繫人但用戶取消時,我需要能夠清除部分聯繫人。聯繫人有一個類型,並且在視圖中還有另一個地址類型。這兩個id在html中都有相同的名稱。我會多玩一點,看看我是否可以搞定它。再次感謝。 – 2010-10-16 13:52:22