Я с интересом прочитал это сообщение в блоге от LosTechies:
Новое поколение волшебных струн в ASP.NET MVC
Они предлагают изменить это:
Url.Action<ProductsController>(x => x.Edit(null), new { productId = prodId })
, который содержит волшебную строку productID, к этому:
Url.Action<ProductsController>(x => x.Edit(null),
new RouteValueDictionary { { ProductsController.ProductId, prodId } })
ProductId теперь строго типизирован.
Или вы можете создать реальный объект вместо анонимного:
Url.Action<ProductsController>(x => x.Edit(null),
new EditProductParams { product = prodId })
Но теперь вам нужно это:
public class EditProductParams
{
public Guid product { get; set; }
}
Их последнее предложение - использовать свободный интерфейс. Вы можете написать это:
Url.Action<ProductsController>(x => x.Edit(null, null),
Params.Product(product).Customer(customer))
Что выглядит довольно чисто (если немного избыточно), но для этого требуется:
public static class Params
{
public static ParamBuilder Product(Product product)
{
var builder = new ParamBuilder();
return builder.Product(product);
}
public static ParamBuilder Customer(Customer customer)
{
var builder = new ParamBuilder();
return builder.Customer(customer);
}
}
... и это:
public class ParamBuilder
{
private Product _product;
private Customer _customer;
public ParamBuilder Product(Product product)
{
_product = product;
return this;
}
public ParamBuilder Customer(Customer customer)
{
_customer = customer;
return this;
}
}
... и это:
public static implicit operator RouteValueDictionary(ParamBuilder paramBuilder)
{
var values = new Dictionary<string, object>();
if (paramBuilder._product != null)
{
values.Add("p", paramBuilder._product.Id);
}
if (paramBuilder._product != null)
{
values.Add("c", paramBuilder._customer.Id);
}
return new RouteValueDictionary(values);
}
Я мог бы увидеть, как это работает, если бы он мог быть написан с использованием шаблонов, так что его нужно было бы написать только один раз.