bugfix> c# > 投稿

MVC 5を使用していて、 System.Web.Mvc.RouteAttribute 経由でルーティングを実行しようとしています 。

したがって、ほとんどのアクションは機能しますが、機能しません。

私は Delete を作成しました -actionと Edit -アクション。どちらも同じように見えます。

ここで Delete -方法:

[Route("data/links/delete/{id}")]
public async Task<ActionResult> Delete(int? id)
{
    // ....
    return View(link);
}
// in the view, DeleteConfirmed is called on submit
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
[Route("data/links/delete/{id}")]
public async Task<ActionResult> DeleteConfirmed(int id)
{
    // ....
    return RedirectToAction("Index");
}

ここで Edit -方法:

[Route("data/links/edit/{id}")]
public async Task<ActionResult> Edit(int? id)
{
    // ....
    return View(link);
}
[HttpPost]
[ValidateAntiForgeryToken]
[Route("data/links/edit")]
public async Task<ActionResult> Edit([Bind(Include = "Id,LinkText,Url,Image,Description")] Link link)
{
    // ....
    return this.RedirectToAction("Index");
}

したがって、それらのルーティングは両方とも同じように見えます。 私がそれらを GET と呼ぶリンク -メソッドも同じです:

@Html.ActionLink("Bearbeiten", "Edit", new { id = item.Id })
@Html.ActionLink("Löschen", "Delete", new { id = item.Id })

面白いことは:

the link to edit gets rendered: http://localhost:45132/data/links/edit?id=2
the link to delete gets rendered: http://localhost:45132/data/links/delete/2

編集が edit?id=2 にレンダリングされる理由 delete/2 に削除します ?

編集リンクが機能しません。編集ページを手動で入力するとhttp:// localhost:45132/data/links/edit/2 リンクが機能します。 しかし、ActionLinkは間違ったURLを取得します。何か案が?

更新

私のRouteConfig.cs

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapMvcAttributeRoutes();
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

回答 2 件
  • 使用することをお勧めしますRouteLinkヘルパーメソッド 代わりに。

    Name を定義する  あなたの Route への財産  属性、たとえば:

    [Route("data/links/edit/{id}", Name = "MyRoute")]
    
    

    次に使用します:

    @Html.RouteLink("Bearbeiten", "MyRoute", new { id = item.Id })
    
    

  • 設計どおりに動作しています。編集には複雑なモデルがありますが、これもルートテンプレートの一部ではありません。そのため、クエリ文字列にリンクを生成するときに提供されるプロパティを配置する必要があります。

    目的のルートを取得するには...

    [HttpGet]
    [Route("data/links/edit/{id:int}")] // GET data/links/edit/2
    public async Task<ActionResult> Edit(int id) {
        // ....
        return View(link);
    }
    [HttpPost]
    [ValidateAntiForgeryToken]
    [Route("data/links/edit/{id:int}")] // POST data/links/edit/2
    public async Task<ActionResult> Edit(int id, [Bind(Include = "Id,LinkText,Url,Image,Description")] Link link) {
        // ....
        return this.RedirectToAction("Index");
    }
    
    

あなたの答え