0

コントローラーには次のものがあります。

    public ActionResult Details(string name)
    {
        Student student = db.Students.FirstOrDefault(x => x.FirstName == name);
        if (student == null)
        {
            return HttpNotFound();
        }
        return View(student);
    }

    // GET: /Student/Details/5
    public ActionResult Details(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Student student = db.Students.Find(id);
        if (student == null)
        {
            return HttpNotFound();
        }
        return View(student);
    }

RouteConfig.cs:

        // /Student/Details/Id
        routes.MapRoute(
            name: "StudentDetailsId",
            url: "{Student}/{Action}/{id}",
            defaults: new { controller = "Student", action = "Details", id = UrlParameter.Optional },
            constraints: new { id = @"\d+" }
        );

        // /Student/Details/Name
        routes.MapRoute(
            name: "StudentDetailsName",
            url: "{Student}/{Details}/{name}",
            defaults: new { controller = "Student", action = "Details" }
        );

        // /Student/Name
        routes.MapRoute(
            name: "StudentName",
            url: "{Student}/{name}",
            defaults: new { controller = "Student", action = "Details" }
        );

だから私は同じアクション名を持ちたいと思っていますが、id:intまたはstringのいずれかでフェッチされます。

ただし、次のようになります。

The current request for action 'Details' on controller type 'StudentController' is ambiguous between the following action methods:
System.Web.Mvc.ActionResult Details(System.String) on type MySuperAwesomeMVCApp.Controllers.StudentController
System.Web.Mvc.ActionResult Details(System.Nullable`1[System.Int32]) on type MySuperAwesomeMVCApp.Controllers.StudentController
4

1 に答える 1

2

コントローラ:

public ActionResult DetailsByName(string name)
{
    Student student = db.Students.FirstOrDefault(x => x.FirstName == name);
    if (student == null)
    {
        return HttpNotFound();
    }
    return View(student);
}

// GET: /Student/Details/5
public ActionResult DetailsById(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Student student = db.Students.Find(id);
    if (student == null)
    {
        return HttpNotFound();
    }
    return View(student);
}

ルート:

 // /Student/Details/Id
    routes.MapRoute(
        name: "StudentDetailsId",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Student", action = "DetailsById", id = UrlParameter.Optional },
        constraints: new { id = @"\d+" }
    );

    // /Student/Details/Name
    routes.MapRoute(
        name: "StudentDetailsName",
        url: "{controller}/{action}/{name}",
        defaults: new { controller = "Student", action = "DetailsByName" }
    );

    // /Student/Name
    routes.MapRoute(
        name: "StudentName",
        url: "{controller}/{name}",
        defaults: new { controller = "Student", action = "DetailsByName" }
    );

MVC では、同じ名前のメソッドは最大 2 つしか持つことができません。その場合、そのうちの 1 つが GET で、もう 1 つが POST でなければなりません。

いいえ、MVC は、一連のルート データを指定して、どのアクション メソッドを呼び出すかを判断できません。メソッドは有効な C# オーバーロードですが、MVC のアクション メソッド セレクターは厳密に型指定されていません。以前にこの質問に回答したことがあります。リンクを見てみましょう...

アップデート

リンクは次のとおりです。https://stackoverflow.com/a/10668537/304832

別のアップデート

私がこれを持ち出すのは、他のルーティングに関する質問に答えるときに、他の人が私に言及してくれたことに感謝しているためです.... AttributeRouting.NETを調べてください。MVC5 の最も話題の機能であるほど素晴らしい機能ですが、オープン ソースのサイド プロジェクトとして開始され、MVC4 で使用できない理由はありません。NuGet パッケージをダウンロードするだけです。このライブラリでは、を使用する必要はありませんMapRoute。アクション メソッドは次のようになります。

// GET: /Students/Details/5
[GET("students/details/{id:int}", ControllerPrecedence = 1)]
public ActionResult DetailsById(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Student student = db.Students.Find(id);
    if (student == null)
    {
        return HttpNotFound();
    }
    return View(student);
}

// GET: /Students/Details/Albert+Einstein
// or GET: /Students/Albert+Einstein
[GET("students/{name}", ActionPrecedence = 1)]
[GET("students/details/{name}")]
public ActionResult DetailsByName(string name)
{
    Student student = db.Students.FirstOrDefault(x => x.FirstName == name);
    if (student == null)
    {
        return HttpNotFound();
    }
    return View(student);
}

MapRoute不可解な正規表現の制約は必要ありません。MVCintstring.

于 2013-11-05T13:55:30.527 に答える