2014-10-30 110 views
1

我是新來的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被設計爲期望視圖的模型完全是傳遞給控制器​​方法的東西 - 通常情況並非如此。

但是很明顯有這個方法嗎?

+0

這裏有一些事情1控制器的方法仍然是方法,它們仍然作爲方法,而且你必須遵循正確的簽名,但爲什麼你認爲你需要做特定的數據傳遞,你可以在控制器或控制器存儲庫方法中操縱它,使其成爲你想要的任何東西。接下來要指出的是,你的模型並不是圍繞你的網站傳遞的一個首要的東西,它可以被分解,控制器可以控制局部視圖而不是一個大視圖 – theDarse 2014-10-30 14:31:28

回答

1

你已經觸及了我在這裏的框架的一個大抱怨。由於視圖是按特定模型鍵入的(我們稱之爲「顯示」模型),並且所有用於創建表單的工具都基於此類型,因此強烈建議您使用與您的參數相同的模型作爲參數顯示。

這不僅是笨拙的,而且會導致其他問題 - 在GET操作上填充的屬性將不會在表單帖子上,除非您用隱藏的字段持久化它們,所以能夠再次返回視圖的錯覺要立即顯示ModelState錯誤。

您向用戶展示的內容可能與您希望用戶回饋的內容(除非您構建的是大型平板表單)是框架的主要疏忽之一。

一個想法是,你可以通過使用諧音爲您的形式緩解這個問題:

@model MyDisplayModel 

<p>@Model.SomeDisplayProperties</p> 

@Html.Partial("MyForm", new MyPostModel()) 

那麼你的部分觀點可以關注一下:

@model MyPostModel 

@Html.TextBoxFor(m => m.SomeProperty) 

哪些應該,我相信,生成更正name屬性以匹配接受MyPostModel的控制器操作。

在的情況下,這是不是這樣的,你基本上有兩種選擇:

  • 拼合您的GET和POST機型出到一兩件事,接受它的不雅,你將有很多空的。
  • 爲您的POST操作創建一個不同的模型,並嘗試使這些屬性與您的GET模型中的屬性匹配或手動生成HTML。