例如:
class MyContoller
{
[MyCustomAttribute]
public ActionResult MyAction(ModelX fromRequest, ModelY fromSession, ModelZ fromCookie)
{
string productId = fromRequest.ProductId;
string userId = fromSession.UserId;
string cultureName = fromCookie.CultureName;
}
}
原因:
我不想访问控制器中的Request,Session和HttpContext,并且将模型传递给动作的MVC3的默认思想非常棒。
我希望MyAction的参数数量很容易改变。例如,如果我添加一个新参数,系统将尝试通过参数的名称或类型在Request,Session或Cookies中查找值(我认为cookie值可能需要自定义ModelBinder)并将填充的模型传递给我的行动我不必编写额外的代码。
自定义属性(示例中的MyCustomAttribute)可以实现这个想法吗?
答案 0 :(得分:2)
我不确定我是否关注自定义属性。你期望自定义属性做什么?
是的,操作方法可以根据需要采用尽可能多的模型参数。显然,在任何给定的请求中只能绑定一个(因为视图只能有一个模型)。无论哪一个被发现都将被绑定,其他人将被置零。
所以,假设您有以下内容:
public class ModelX {
public string X {get;set;}
}
public class ModelY {
public string Y {get;set;}
}
public class ModelZ {
public string Z {get;set;}
}
你有一个这样的行动方法:
public ActionResult DoIt(ModelX x, ModelY y, ModelZ z)
{
return View();
}
在您的DoIt.cshtml中,您有以下内容:
@model ModelZ
@using(Html.BeginForm()) {
@Html.TextBoxFor(x => x.Z)
<input type="submit"/>
}
如果在文本框中键入内容并提交,则模型绑定器会将ModelZ与您输入的值绑定,而ModelX和ModelY将为null。
如果你的意思是一个动作方法可以同时绑定多个模型,那么我将不得不问你..你打算如何让一个视图有多个模型?您当然可以创建一个包装器模型来包含多个模型,但视图只能有一个。
答案 1 :(得分:1)
创建一个包含ModelX
,ModelY
和ModelZ
的复合ViewModel类。然后,您可以填充新ViewModel类的实例,并将其传递给控制器方法。
public class XYZViewModel
{
public ModelX fromRequest { get; set; }
public ModelY fromSession { get; set; }
public ModelZ fromCookie { get; set; }
}
public class MyController
{
[MyCustomAttribute]
public ActionResult MyAction(XYZViewModel myModel)
{
string productId = myModel.fromRequest.ProductId;
string userId = myModel.fromSession.UserId;
string cultureName = myModel.fromCookie.CultureName;
}
}
答案 2 :(得分:1)
您始终可以将多个参数传递给控制器操作,是的。关键是要确保它们在请求中正确序列化。如果您使用的是表单,则表示使用Html帮助程序方法。
例如,假设你想要一个这样的动作:
public ActionResult Multiple(ModelA a, ModelB b)
{
// ...
}
您可以为每个模型创建简单的局部视图:
@model MyProject.Models.ModelA
@Html.EditorForModel()
然后在多个视图中,渲染部分视图,如下所示:
@{ using (Html.BeginForm("Multiple", "MyController", FormMethod.Get))
{
@Html.Partial("A", new MyProject.Models.ModelA())
@Html.Partial("B", new MyProject.Models.ModelB())
<input type='submit' value='submit' />
}
我在这里将方法设置为 GET ,以便您可以轻松查看MVC如何传递参数。如果您提交表单,您将看到MVC成功地反序列化每个对象。