0

我有一個沒有參數的操作方法。之後ASP.NET MVC中的模型綁定:如何將QueryString值轉換爲視圖模型?

QueryString集合包含我所有的值。 QueryString的鍵匹配我的視圖模型屬性。

var queryStringValueProvider = new QueryStringValueProvider(ControllerContext); 
var providerResult = queryStringValueProvider.GetValue(ValidationKeys.Id); // ?! 

var viewModelTypeName = queryString[ValidationKeys.ViewModelType]; 

var viewModelType = Type.GetType(viewModelTypeName); 
var viewModelInstance = providerResult.ConvertTo(viewModelType); // throws an InvalidOperationException 

我怎樣才能在QueryString集合轉換成視圖模型? 當您只是將視圖模型傳遞給操作方法參數時,ASP.NET MVC已經做到了這一點。所以我需要的是一個模型綁定使用ASP.NET MVC機制。

+0

這可能會回答你的問題。 http://stackoverflow.com/questions/627838/asp-net-mvc-getting-querystring-values – Ademar

+0

@Ademar不,它不。參數名稱/屬性名稱僅在運行時已知。我嘗試使用RemoteAttribute屬性驗證用戶輸入數據。我想要一個單獨的操作方法來處理應該是唯一的屬性的遠程驗證。 – Rookian

回答

0

我的控制器動作

var viewModelTypeName = queryString[ValidationKeys.ViewModelType]; 
var viewModelType = Type.GetType(viewModelTypeName); 
var instance = Activator.CreateInstance(viewModelType); 
UpdateModelUsingQueryString(instance); 

的UpdateModel

protected internal void UpdateModelUsingQueryString<TModel>(TModel model) where TModel : class 
{ 
    if (model == null) throw new ArgumentNullException("model"); 

    Predicate<string> propertyFilter = propertyName => new BindAttribute().IsPropertyAllowed(propertyName); 
    var binder = Binders.GetBinder(typeof(TModel)); 

    var bindingContext = new ModelBindingContext() 
    { 
     ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, model.GetType()), 
     ModelState = ModelState, 
     PropertyFilter = propertyFilter, 
     ValueProvider = new QueryStringValueProvider(ControllerContext) 
    }; 
    binder.BindModel(ControllerContext, bindingContext); 
} 

問題是UpdateModelTryUpdateModel在設計上不適用於object。 這兩種方法都使用typeof(TModel)。但是你必須使用model.GetType()

看看:Model Binding - Type in External Assembly

達林季米特洛夫給了正確的答案:)

0

要手動執行自定義模型綁定,請創建自定義模型綁定器(實現IModelBinder)並將其註冊到您的IoC容器。

或者您可以在您的操作方法中調用this.UpdateModel。這應該將ValueProvider(RouteData,Request.Form集合和QueryString)中的值綁定到您的模型。

+0

IoC與我的問題有何關係:o? – Rookian

+0

MVC將使用您的IoC容器來解析模型活頁夾。如果您創建自己的模型綁定器,則需要將其註冊到您的IoC容器。 –

+0

爲什麼我必須編寫我自己的模型聯編程序? – Rookian

0

你要求的是序列化。爲簡單起見,可以將構造函數重載接受QueryStringValueProvider作爲參數,構造函數負責初始化基於提供者的所有模型屬性。如果你堅持使用字符串,你可以很容易地將這樣的構造函數放入一個可以被所有模型繼承的模型基類中。

這也可以構建爲擴展方法,因此可以稱爲「按需」而不是在施工中。

0

你可以使用TryUpdateModel

public ContentResult TestAction() 
{ 
    var model = new MyModel(); 

    if(TryUpdateModel(model, new QueryStringValueProvider(ControllerContext))) 
    { 
     return Content("success"); 
    } 

    return Content("failed"); 
} 
+0

你是否自己嘗試過? – Rookian

+0

@Rookian你問一個問題,我給了一個答案。這取決於你是否嘗試。 – VJAI

+0

好吧,如果你知道TryUpdateModel正常工作模式。但我不知道模型,但它的類型。 – Rookian