1

有没有办法在传递的对象实际进入/(传递给)action-method之前将其更改为action-method?..例如......默认情况下,我希望Index()-action-method始终拿 MyClass 的一个论点..

所以.. 如果用户访问 mydomain.com/AController/

触发的动作方法应该是

public ActionResult Index(MyClass arg)
{ 
    return View();
}

我不太确定如何解释这一点.. 但希望你能明白.. 我真正想做的与 Umbraco 在他们的 MVC 项目中所做的相同.. 他们总是传递一个 RenderModel 对象,除了我想拥有自己的类型而不是 RenderModel ..

提前致谢!

4

2 回答 2

1

据我了解您的问题,您希望使用默认arg值调用您的操作(如果未提供)

将您的 MyClass 视为:

public class MyClass 
{
    public int Id { get; set; }
    public string Name { get; set; }
}

您可以定义您的路线,如:

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{arg}",
            defaults: new { controller="Home",
                            action = "Index", 
                            arg = new MyClass() { Id = 1, Name = "test" } 
                      }
        );

我想另一种选择是有一个 custom ModelBinder,或者在较低级别,一个 custom ValueProvider

于 2013-10-18T13:20:28.730 回答
0

如果您的类足够简单,则无需拦截对操作的调用。

例如,如果该类具有 、 、 甚至等属性intstringDateTimeMVCIEnumerable<int>将自动将表单发布数据或查询字符串映射到该类。

因此,像这样的 URLexample.com/your-path/?id=1&categories=3,4,56&tags=this,that会自动映射到像这样的类:

public YourClass
{
    public int Id { get; set; }
    public IEnumerable<int> Categories { get; set; }
    public IEnumerable<string> Tags { get; set; }
}

如果您需要对数据进行额外的工作,例如,如果您发布 XML/JSON 并且需要在填充类之前对其进行反序列化,那么@jbl 的答案就是您的最佳选择。

从 Umbraco 的角度来看,如果您正在劫持您的控制器,那么您可以简单地将您的类Index()作为附加参数添加到操作中,例如Index(RenderModel model, YourClass arg). 这将拾取并填充任何其他数据传递到您的页面。

@jbl 使用 Umbraco 的方法的问题在于 Umbraco 为您处理路由,因此您不能在不完全绕过 Umbraco 控制器的情况下指定自己的路由 - 这违背了使用 Umbraco 的目的:)

于 2013-10-22T09:23:06.657 回答