2014-10-30 72 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。