2011-07-12 54 views
0

我有一個ASP.NET MVC 3視圖,基本上有兩種形式,但它們駐留在同一個窗體標記中。 不知道這是否是解決這個問題的正確方法,所以請建議是否有更好的解決方案。根據用戶輸入控制要驗證的字段

用戶在此單頁上有兩個選項。這是關於訂閱新聞通訊的,如果用戶已經有訂閱號碼,則只需要對其中一個「表格」進行驗證。 如果用戶沒有訂閱號碼,則需要驗證其他表單。 我知道,這可以開發更多的用戶友好(和程序員),但這是客戶的要求。

我的問題是,當提交表單時,所有的字段當然是有效的。我需要提供一個檢查來查看用戶是否填寫了SubscriptionNumber字段,然後控制要驗證的「表單」。 你有什麼建議如何做到這一點?我當然希望儘可能簡單。

這是我的看法訂閱:

@model SubscribeNewsletterModel 

@using (Html.BeginForm()) 
{  
    @Html.EditorFor(m => m.ExistingSubscriber)   
    @Html.EditorFor(m => m.NewSubscription) 
    @Html.ValidationSummary() 
    <input type="submit" /> 
} 

這個觀點我的視圖模型,如下所示:

public class SubscribeNewsletterModel 
{ 
    public SubscribeNewsletterModel(SubscriptionModel subscriptionModel, 
     ExistingSubscriberModel existingSubscriberModel) 
    { 
     this.NewSubscription = subscriptionModel; 
     this.ExistingSubscriber = existingSubscriberModel; 
    } 

    // The models contains validation logic (attributes like Required, etc.) 

    public SubscriptionModel NewSubscription { get; set; } 
    public ExistingSubscriberModel ExistingSubscriber { get; set; } 
} 

我的控制器負責處理POST請求。這並不做任何事情 - 只是爲了驗證:

[HttpPost] 
public ActionResult Subscribe(
    [Bind(Prefix="NewSubscription")] SubscriptionModel newSubscriptionModel, 
    [Bind(Prefix="ExistingSubscriber")] ExistingSubscriberModel existingSubscriberModel) 
{ 
    var vm = new SubscribeNewsletterModel(newSubscriptionModel, existingSubscriberModel);  
    return View(vm); 
} 

回答

0

根據您的病情:「這是關於訂閱簡訊,如果用戶已經有一個預約號碼,只有一個‘形式’是需要驗證,如果用戶沒有訂閱號碼,則需要驗證其他表單。「

在您的視圖中創建參數,將返回控制器驗證您的表單並使用此參數確定要驗證的內容。您將必須使用

ModelState 

您可以刪除不想通過密鑰驗證的屬性。

+0

我希望能有一個更簡單的解決方案,但我最終可能會這樣做。我會將問題留待一兩天。 –