Поздно к вечеринке, но поскольку в ASP.NET MVC не так много об использовании HashIds, я поделюсь своим решением с использованием пользовательских классов ModelBinder
и BaseModel
. Конечный маршрут выглядит примерно как /example/voQ/details
.
Сначала вам нужна модель, из которой ваши существующие модели могут расширяться и генерировать HashId;
public class abstract BaseModel
{
private static readonly Hashids __hashId = new Hashids("seed", 2);
public Id { get; set; }
[NotMapped]
public HashId
{
get { return BaseModel.__hashId.Encode(this.Id); }
}
}
Связующее необходимо зарегистрировать в Global.asax
для каждой модели:
ModelBinders.Binders.Add(typeof(ExampleModel), new ControllerModelBinder<ExampleModel>());
Затем действие может использовать модель напрямую, не беспокоясь о хэш-идентификаторе:
public ActionResult Details(ExampleModel model)
{
return View(model);
}
Настройка ссылки такая же, но вместо передачи Id
необходимо использовать свойство HashId
из BaseModel
.
@Url.Action("Details", new { id = item.HashId })
Наконец, папка модели:
public class ControllerModelBinder<T> : DefaultModelBinder
where T : BaseModel
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType == typeof(T))
{
string hash = bindingContext.ValueProvider.GetValue("id").RawValue.ToString();
if (!string.IsNullOrWhiteSpace(hash))
{
int id = HashIdHelper.ToInt(hash);
if (id > 0)
{
using (ApplicationContext context = new ApplicationContext())
{
DbRawSqlQuery<T> query = context.Database.SqlQuery<T>(string.Format("SELECT * FROM {0} WHERE id = @Id LIMIT 1", EntityHelper.GetTableName<T>(context)), new MySqlParameter("@Id", id));
try
{
T model = query.Cast<T>().FirstOrDefault();
if (model != null)
{
return model;
}
}
catch (Exception ex)
{
if (ex is ArgumentNullException || ex is InvalidCastException)
{
return base.BindModel(controllerContext, bindingContext);
}
throw;
}
}
}
}
}
return base.BindModel(controllerContext, bindingContext);
}
}
person
sixones
schedule
05.06.2015