私は、URLリクエストでカテゴリー(属性:IDと名前を持つ)を表示するインデックスページを持っています:http://localhost:62745/home/index
。URLルートにモデルデータをマップする方法は?
カテゴリをクリックすると、http://localhost:62745/Home/Products/6
になります。
URLをより詳細にして、直前のURLのカテゴリIDプロパティ6
を、クリックしたばかりのカテゴリのname
プロパティに置き換えます。
マイルートの設定は、次のようになります。
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Categories",
url: "{controller}/{action}/{categoryName}",
defaults: new { controller = "Category", action = "Index", categoryName = UrlParameter.Optional }
);
}
}
最初MapRoute()
メソッドがすでに実装されました。私は問題を解決することを望む2番目を追加しましたが、それはしませんでした。
これは、製品のための私のコントローラアクションである:両方のあなたのルートは、それらがどのように解釈されるかという点で同一である
// GET: Product
public async Task<ActionResult> Index(int? id, string categoryName)
{
var products = (await db.Categories.Where(c => c.Id == id)
.SelectMany(p => p.Products.Select(x => new ProductViewModel { Id = x.Id, Name = x.Name, ByteImage = x.Image, Price = x.Price}))
.ToListAsync());
categoryName = db.Categories.Where(c => c.Id == id).Select(c => c.Name).ToString();
if (products == null)
{
return HttpNotFound();
}
return View(new ProductIndexViewModel{ Products = products, CategoryId = id });
}
私は 'id'が' Category'名の数値識別子であると思いますか?そうであれば、 'id'は一意であると仮定し、' Category'には一意の制約はありません。人間が読める 'Category'をあなたが捨てようとしている値として使うと、問題につながるでしょう。あなたが達成しようとしていることは何ですか?これは単にクエリ文字列に読み取り可能な値を持つことですか? – gmiley
注目すべき点の1つは、常に最上位の特定のものから最も下のものまで移動したいルートをマッピングする場合です。だから、あなたが現在持っているので、デフォルトルートはリストの最後である必要があります。それ以外のルートはチャンスを得ることはありません –
[なぜasp.net mvcの一般的なルートの前に特別なルートを最初にマップするのですか?](http:// stackoverflow。com/a/35674633/181087)を参照してください。 – NightOwl888