1

例如:

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 值可能需要自定义 ModelBinders)并将填充的模型传递给我的行动。我不必编写额外的代码。

自定义属性(示例中的 MyCustomAttribute)可以实现这个想法吗?

4

3 回答 3

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 将为空。

如果你的意思是一个动作方法可以同时绑定多个模型,那么我不得不问你.. 你打算如何让一个视图有多个模型?您当然可以创建一个包装模型来包含多个模型,但一个视图只能有一个。

于 2012-04-12T01:35:36.633 回答
1

创建一个包含 和 的复合ModelXViewModelModelYModelZ。然后,您可以填充新 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;
    }
}
于 2012-04-12T01:34:37.470 回答
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 成功反序列化每个对象。

于 2012-04-12T01:43:29.547 回答