在ASP.NET MVC中按发布的内容类型进行路由

时间:2011-04-21 13:38:51

标签: c# .net asp.net-mvc asp.net-mvc-routing

我有一个fixedURL,我想发布不同类型的xml消息,使用DataContracts反序列化。根据反序列化消息的类型,我想路由到: 重载方法,例如

void Process(ContractType1 request) {}
void Process(ContractType2 request) {}

所以在某些时候我需要反序列化此消息,并希望允许默认路由规则匹配正确的方法。我应该使用哪个扩展点?或者甚至更好,我可以开箱即用吗?!

如果它有任何区别,我正在使用MVC 3。

2 个答案:

答案 0 :(得分:4)

如果ASP NET MVC没有针对不同的HTTP方法进行修饰,那么ASP NET MVC不会考虑重载 - 例如一个用于POST,另一个用于GET

您需要使用[ActionName(Name = "Process2")]来更改路线名称。并且您将不得不使用不同的路径来访问(如果HTTP方法是相同的)

看看here


除了技术解决方法之外,将different contracts传递到同一网址是违反 REST 原则的。数据可以采用不同的格式(XML,JSON,...),但必须相同。 URI定义了一个独特的意图。现在可以有一个公共垃圾站,其中文档都被转储到同一个URI,但ASP NET MVC默认模型绑定器将无法帮助您,您需要创建自己的模型绑定器

答案 1 :(得分:1)

与其他答案相反,我说这是可能的

Asp.net MVC是一个可以轻松扩展的优秀平台。基本上我已经编写了一个特殊的操作方法选择器,它可以编写可以提供相同HTTP方法但延迟参数的重载。默认情况下,您会收到无法解决操作方法的运行时错误。但是当你使用这个动作方法选择器时,你可以摆脱这个错误。

基本上,如果您的参数类具有不同的参数名称,您实际上可以通过它选择方法。

操作方法选择器名为RequiresRouteValuesAttribute,典型的使用方案是默认路由,其中​​id是可选的:

{controller}/{action}/{id}

这意味着你要么必须写

public ActionResult Index(int? id)
{
    if (id.HasValue)
    {
        // display details view
    }
    else
    {
        // display master view
    }
}

但是通过使用我的动作方法选择器,您可以轻松编写两种动作方法:

public ActionResult Index()
{
    // display master view
}

[RequiresRouteValues("id")]
public ActionResult Index(int id)
{
    // display details view
}

只要您的自定义类型具有不同的属性名称或方法使用不同的参数名称,就可以对您的操作方法应用相同的操作。所以在你的情况下它可能是这样的:

[RequiresRouteValues("first.Id")] // when you provide prefix with your form
// or
[RequiresRouteValues("Some.ContractType1.Distict.Property.Name")]
public ActionResult Process(ContractType1 first)
{
    // do what's appropriate
}

[RequiresRouteValues("second.Id")] // when you provide prefix with your form
// or
[RequiresRouteValues("Some.ContractType2.Distict.Property.Name")]
public ActionResult Process(ContractType2 second)
{
    // do what's appropriate
}

Read all the details关于此操作方法选择器并获取代码。