2011-11-14 62 views
1

每當有一些自定義驗證或模型狀態調整時,我必須依賴魔術字符串(反映屬性名稱)到目前爲止。當然,一定有更好的辦法。Mvc ModelState KeyFor屬性

說你有一個2提交按鈕的形式。您已通過添加必需屬性來設置驗證規則:

public class MyModel 
{ 
    [Required] 
    public string ValueOne { get; set; } 
    [Required] 
    public string ValueTwo { get; set; } 
} 

這將始終驗證這兩個字段。但是,假設我已經在上面模型的表單和編輯器中添加了兩個按鈕。按鈕一隻需要ValueOne,按鈕二隻需要ValueTwo。

Typically I would have custom validation code that checks which button was clicked and do something along the lines: 

private void ValidateViewModel(MyModel viewModel) 
{ 
    foreach (var key in ModelState.Keys) 
     ModelState[key].Errors.Clear(); 
    if (Request[{ButtonOneName}] != null && string.IsNullOrEmpty(viewModel.ValueOne)) 
     ModelState.AddModelError("ValueOne", "Required"); 
    else if (Request[{ButtonTwoName}] != null && string.IsNullOrEmpty(viewModel.ValueTwo)) 
     ModelState.AddModelError("ValueTwo", "Required"); 
} 

不是很漂亮,我知道但是...我的牛肉是魔法字符串「ValueOne」和「ValueTwo」。還有清除錯誤的方式。有沒有辦法生成這些密鑰?我在尋找類似:

ModelState.KeyFor<MyModel>(m => m.ValueOne) 

然後邏輯延伸:

ModelState.Get<MyModel>(m => m.ValueOne) 

在我開始重新發明輪子 - 是否有這樣的事情已經隱藏的地方?

在問你之前,我通常會定義靜態類SubmitActions,其中包含表示提交按鈕名稱的常量字符串。不,我不能將它分成多個形式,因爲視圖是呈現的。

感謝您的任何建議。

+0

您是否曾經找到過解決方案? ModelState.KeyFor (m => m.ValueOne)將正是我所需要的類似的東西,我正在做... – LDJ

回答

1

有一個模型驗證的改進MVC 3,這將使你能夠根據彼此相關

屬性來檢查驗證,方法是使用IValidatableObject接口內置於.NET 4實現自定義一個類的驗證方法。此方法可以將驗證規則應用於多個屬性,併產生多個驗證錯誤,

您看過嗎?

Model Validation Improvements part

+0

謝謝。我一定會看看這樣做的事情。聽起來它應該能夠做我需要的東西。我只是跳[e可以將該方法與內置驗證屬性相結合。當我有時間測試時,我會留下反饋。 –