2015-06-08 63 views
0

我正在開發一個Sitecore/MVC應用程序,我的第一個MVC應用程序,所以我正在學習。毫無疑問,我在某個地方出現了問題。對子視圖的MVC驗證

我有一個籃子,它有2個地址的意見,其中一個用於計費和另一個交付。還有一個複選框用於「交付與交費相同」,允許用戶只填寫一個地址。當用戶選中此複選框時,投遞地址div會崩潰。

主要觀點:

<div class="pure-control-group"> 
     <h2>Billing Address</h2> 
     @Html.Action("Init", "Address", new {AddressType = "Billing", @Address = Model.Billing}) 
    </div> 
    <!-- Delivery Address--> 
    <div class="pure-control-group"> 
     <h2>Delivery Address</h2> 
     <label for="UseBillingForShipping" class="pure-checkbox"> 
      @Html.CheckBoxFor(x => x.UseBillingForShipping) 

      Same as Billing Address above 
     </label> 
    </div> 
    <div class="manual-address-entry focus-pane"> 
     @Html.Action("Init", "Address", new {AddressType = "Delivery", @Address = Model.Delivery}) 
</div> 

地址視圖的例子:當我試圖驗證發生

<div class="pure-u-1 pure-u-sm-1-2 pure-u-lg-2-5"> 
    <label for="@(Model.AddressType).FirstName">First Name<span class="required">*</span></label> 
    <input type="text" id="@(Model.AddressType).FirstName" name="@(Model.AddressType).FirstName"> 
    @Html.ValidationMessageFor(x=>x.FirstName) //<= How to handle this? 

</div> 
<div class="pure-u-1 pure-u-sm-1-2 pure-u-lg-2-5"> 
    <label for="@(Model.AddressType).LastName">Last Name<span class="required">*</span></label> 
    <input type="text" id="@(Model.AddressType).LastName" name="@(Model.AddressType).LastName"> 
    @Html.ValidationMessageFor(x=>x.LastName) //<= How to handle this? 
</div> 

我的問題。

[Required(ErrorMessage = "First Name is required")] 
public string FirstName { get; set; } 
[Required(ErrorMessage = "Last Name is required")] 
public string LastName { get; set; } 

所以我有2個:在地址視圖控件的ID,以便於他們提供像id="Billing.LastName"

在地址模式的字段將帳單地址,例如的情況下被命名爲id="@(Model.AddressType).LastName"問題:

  1. 如何創建@Html.ValidationMessageFor標記。我試過@Html.ValidationMessageFor(x=>x.FirstName)和類似的labelfor<label for="@(Model.AddressType).LastName">),@Html.ValidationMessageFor(@(Model.AddressType).LastName),都沒有工作。我開始認爲我完全錯誤地認識到了這一點。
  2. 第二個是如果用戶選擇相同地址的複選框,我將如何去關閉僅對第二個地址的驗證。

回答

1

處理此問題的最簡單方法是使用地址模型的自定義EditorTemplate。假設其public class Address,然後創建一個名爲Address.cshtml/Views/Shared/EditorTemplates視圖(即命名,以配合您的類型的名稱)在主視圖然後

@model yourAssembly.Address 
@Html.LabelFor(m => m.FirstName) 
@Html.TextBoxFor(m => m.FirstName) 
@Html.ValidationMessageFor(m => m.FirstName) 
... // ditto for other properties of Address 

@Html.EditorFor(m => m.Billing) 
@Html.CheckBoxFor(x => x.UseBillingForShipping) 
@Html.EditorFor(m => m.Delivery) 

EditorFor()方法將使用您的模板並正確命名所有綁定元素(包括驗證消息)

請注意,因爲您有一個[Required]屬性,隱藏'Delivery'地址的腳本也應該確保它將'Billing'的內容複製到'Delivery'地址控件,否則驗證將失敗(或者,您可以使用[RequiredIf]驗證屬性)

+0

這現在有道理。我之前看過這個,但對我來說沒有意義。它似乎被用於不同的事情。感謝您的解釋,我現在將其轉換爲編輯器模板。 – Fred

+0

完美!謝謝 – Fred