我是新来的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