在我的ASP.NET MVC應用程序,我有充當模板爲幾個不同的視圖模型的接口:傳遞接口到ASP.NET MVC控制器操作方法
public interface IMyViewModel
{
Client Client1 { get; set; }
Client Client2 { get; set; }
Validator Validate();
}
所以,我的觀點模型被這樣定義:
public interface MyViewModel1 : IMyViewModel
{
Client Client1 { get; set; }
Client Client2 { get; set; }
// Properties specific to MyViewModel1 here
public Validator Validate()
{
// Do ViewModel-specific validation here
}
}
public interface MyViewModel2 : IMyViewModel
{
Client Client1 { get; set; }
Client Client2 { get; set; }
// Properties specific to MyViewModel2 here
public Validator Validate()
{
// Do ViewModel-specific validation here
}
}
然後我現在有一個單獨的控制器動作做用於每個不同類型的驗證,使用模型綁定:
[HttpPost]
public ActionResult MyViewModel1Validator(MyViewModel1 model)
{
var validator = model.Validate();
var output = from Error e in validator.Errors
select new { Field = e.FieldName, Message = e.Message };
return Json(output);
}
[HttpPost]
public ActionResult MyViewModel2Validator(MyViewModel2 model)
{
var validator = model.Validate();
var output = from Error e in validator.Errors
select new { Field = e.FieldName, Message = e.Message };
return Json(output);
}
這很好 - 但如果我有30個不同的視圖模型類型,那麼將不得不有30個單獨的控制器操作,所有相同的代碼除了方法簽名,這似乎是不好的做法。
我的問題是,我如何合併這些驗證操作,以便我可以傳遞任何類型的視圖模型並調用它的Validate()方法,而不必關心它是哪種類型?
起初,我嘗試使用接口本身作爲動作參數:
public ActionResult MyViewModelValidator(IMyViewModel model)...
但這並不起作用:我得到一個Cannot create an instance of an interface
例外。我認爲模型的一個實例會被傳遞給控制器動作,但顯然情況並非如此。
我確定我缺少一些簡單的東西。或者我剛剛接近這一切都是錯誤的。誰能幫我嗎?
我完全是因爲時間限制而採用這種方法,但是您還解釋了爲什麼當對象傳入控制器時它不是一個實例,這對了解這一點非常有用。 – 2010-08-26 12:16:04