2015-06-04 131 views
2

我有一個添加產品表單,這取決於用戶以前添加了類別,產品類型等。而不是讓他們完成表單,然後意識到他們不能提交,我想在表單第一次加載時顯示錯誤。獲取視圖模型屬性的模型狀態鍵

我想將此錯誤添加到相應的屬性的模型狀態 - 所以我的問題是如何獲得該屬性的模型狀態鍵名稱?

代碼

Model.Step1.PopulateData(_productTypeSvc.GetList(), _websiteSvc.GetMaximumNumberOfProductImages(HttpContext.Request.Url.Host)); 
    Model.Title = "Add A Product - Step 1: The Basics"; 
    if (Model.Step1.ProductTypes.IsNullOrEmpty()) 
    { 
     //Rather than string.Empty, I want to programmatically get the correct key to add the error to.. 
     //E.g. if it were the view - HtmlHelper.NameFor(m => m.Step1.ProductTypeID) 
     ModelState.AddModelError(string.Empty, "Please add at least one product type before adding products."); 
    } 

我知道我可以假人的HtmlHelper對象,但我寧願避免這種情況,不知道是否有更好的辦法?

+0

它只是財產的完全合格的名字 - 'ModelState.AddModelError( 「Step1.ProductTypeID」,「請... 「);' –

+0

我知道,但我想強烈地輸入它,而不是一個鬆散的字符串。 – Carl

+0

它沒有過載。你可以創建一個擴展方法並用反射來實現這個表達式。 –

回答

1

在MVC找到一個合適的擴展名:

System.Web.Mvc.ExpressionHelper.GetExpressionText(LambdaExpression expression); 

MSDN Here

謝謝反正傢伙。

更新:

public static string GetPropertyName<TModel, TValue>(this TModel model, Expression<Func<TModel, TValue>> propertySelector) 
{ 
    return ExpressionHelper.GetExpressionText(propertySelector); 
} 

然後使用擴展:

ModelState.AddModelError(Model.GetPropertyName(m => m.Step1.ProductTypeID), "Please add at least one product type before adding products."); 
+0

好的,但在這種情況下,你是如何使用'ExpressionHelper.GetExpressionText'的? – ctekse

+0

@ctekse,我更新了我的實現答案 - 這是使用內置的表達式幫助在System.Web.Mvc命名空間中創建擴展。希望這可以幫助。 – Carl

+0

類似[SO帖子](https://stackoverflow.com/questions/12010511/get-the-key-for-a-strongly-typed-model-in-the-controller),這是AddModelError的擴展。不是我的博客btw。 – CrnaStena