Asp.net MVC я могу иметь меню, которое ссылается как по идентификатору и имени пользователя - PullRequest
1 голос
/ 29 июня 2009

Я в основном беру шаблон ASP.NET MVC по умолчанию и расширяю его:

Глядя на site.master, я вижу это для меню:

<ul id="menu">              
    <li><%= Html.ActionLink("Home", "Index", "Home")%></li>
     <li><%= Html.ActionLink("About", "About", "Home")%></li>
</ul>

Затем я редактирую его следующим образом:

<ul id="menu">              
    <li><%= Html.ActionLink("Home", "Index", "Home")%></li>
    <li><%= Html.ActionLink("About", "About", "Home")%></li>
    <li><%= Html.ActionLink("My Contact Info", "Details/" + Html.Encode(Page.User.Identity.Name), "Users")%></li>
</ul>

Проблема в том, что в контроллере у меня есть два разных метода:

//
// GET: /Users/Details/userName
public ActionResult Details(string loginName)
{
    UserInfo user = repo.GetUserByName(loginName);
    return View(user);
}

//
// GET: /Users/Details/5
public ActionResult Details(int id)
{
    UserInfo user = repo.GetUser(id);
    return View(user);
}

Я получаю исключение, которое говорит, неоднозначный метод. Потому что он не может понять, какой позвонить. Я хотел бы надеяться, что он сможет выяснить это по типу данных, но, очевидно, нет.

У кого-нибудь есть предложения по поддержке просмотра деталей и запросов по различным полям? (Конечно, все запрашиваемые поля уникальны.)

1 Ответ

2 голосов
/ 29 июня 2009

Если у вас был такой маршрут, как:

routes.MapRoute(
            "Users",                                              // Route name
            "Users/Details/{username}",                           // URL with parameters
            new { controller = "Users", action = "Details", username = "" }  // Parameter defaults
        );

, который можно использовать, чтобы избежать двусмысленности с маршрутом по умолчанию. Вам нужно будет поставить его перед маршрутом по умолчанию "{controller} / {action} / {id}", чтобы он получил приоритет ...

Тогда вы можете выполнить действие, подобное:

// GET: /Users/Details/username   or //GET: /Users/Details?id=theId
public ActionResult Details(string username, int? id)
{
   if(id!=null)
   {
      UserInfo user = repo.GetUser(id.Value);
      return View(user);
   }
   if(!String.IsNullOrEmpty(username))
   {
      UserInfo user = repo.GetUserByName(username);
      return View(user);
   }
...//Handle bad url.. redirect to error...you decide ;) 
}

Затем вы можете получить доступ к этому действию следующим образом:
/ Пользователи / Детали / имя пользователя или ..
/ Users / Детали? ID = идентификатор пользователя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...