我是新來的MVC,並試圖找出一些最佳做法。就在今天,我發現,當我宣佈類似的控制器方法,以便:MVC ViewModels和網址生成
public class TestController : Controller
{
public class ViewModel
{
public String MyValue { get; set; }
}
public ActionResult Index(ViewModel vm)
{
return View(vm);
}
}
然後,參數MyValue
不僅可以與vm.MyValue=somevalue
查詢參數傳遞中,也與MyValue=somevalue
。我喜歡這樣,因爲這樣我可以生成一個URL到控制器的方法與
Url.Action("index", vm)
這是更名號,比類似
Url.Action("index", new { vm = vm })
,我想我不得不寫以前安全。由於控制器採取非常查看模型的視圖,我甚至可以編寫
@Html.HiddenFor(vm => vm.MyValue)
在我看來,獲取正確的名稱。
現在,這裏的地方我結結巴巴:
視圖的模型和控制器方法的「參數模型」很少會發生同樣的事情,因爲通常控制器會爲視圖獲取額外的數據。
如果我介紹第二個模型,並有任一參數模型包括視圖模型或其他方式輪,我輸的有名稱匹配的美麗,簡單的方法,上面顯示:
public class TestController : Controller
{
public class ParameterModel
{
public String MyValue { get; set; }
}
public class ViewModel
{
public ParameterModel ParameterModel { get; set; }
}
public ActionResult Index(ParameterModel pm)
{
var vm = new ViewModel() { ParameterModel = pm };
return View(vm);
}
}
現在,在視圖中,我不得不寫
@Html.HiddenFor(vm => vm.ParameterModel.MyValue)
這就造成ParameterMode.MyValue=somevalue
的參數字符串,這是不對的。
就好像MVC被設計爲期望視圖的模型完全是傳遞給控制器方法的東西 - 通常情況並非如此。
但是很明顯有這個方法嗎?
這裏有一些事情1控制器的方法仍然是方法,它們仍然作爲方法,而且你必須遵循正確的簽名,但爲什麼你認爲你需要做特定的數據傳遞,你可以在控制器或控制器存儲庫方法中操縱它,使其成爲你想要的任何東西。接下來要指出的是,你的模型並不是圍繞你的網站傳遞的一個首要的東西,它可以被分解,控制器可以控制局部視圖而不是一個大視圖 – theDarse 2014-10-30 14:31:28