ASP.NET MVC3:Action可以接受多个模型参数吗?

时间:2012-04-12 01:31:45

标签: asp.net asp.net-mvc-3

例如:

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)可以实现这个想法吗?

3 个答案:

答案 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)

创建一个包含ModelXModelYModelZ的复合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成功地反序列化每个对象。