У меня проблемы с одной конкретной проблемой, я надеялся, что кто-нибудь может мне помочь.
Я закончил учебник MVC Music Store, и теперь я пытаюсь добавить некоторые функции администратора - попрактикуйтесь, поскольку мне придется делать это в приложении MVC на работе. Приложение использует API членства в aspnet, и то, что я сделал до сих пор, - это создание списка пользователей.
Что я хочу сделать, это нажать на имя пользователя, чтобы изменить его пароль. Попробовать перенести имя пользователя в контроллер changeUserPassword (по индивидуальному заказу). Я зарегистрировал новый маршрут в файле global.asax.cs, чтобы отобразить имя пользователя в URL-адресе, который работает до сих пор.
UserList View
<%: Html.RouteLink(user.UserName, "AdminPassword", new { controller="StoreManager", action="changeUserPassword", username = user.UserName }) %>
Global.asax.cs
routes.MapRoute(
"AdminPassword", //Route name
"{controller}/{action}/{username}", //URL with parameters
new { controller = "StoreManager", action = "changeUserPassword", username = UrlParameter.Optional}
);
Так что теперь, когда я достигаю представления changeUserPassword, URL выглядит так:
http://localhost:51236/StoreManager/changeUserPassword/Administrator
Вот действие GET changeUserPassword:
public ActionResult changeUserPassword(string username)
{
ViewData["username"] = username;
return View();
}
Я хотел сохранить имя пользователя в ViewData, так как хотел бы использовать его в GET changeUserPassword для отображения, а также в качестве скрытого значения в форме. Это сделано для того, чтобы я мог сбросить пароль.
После отладки кода кажется, что 'username' имеет значение null.
Как я могу заставить это работать, чтобы имя пользователя переносилось из Html.RouteLink в действие changeUserPassword?
Буду признателен за любую помощь:)
Вот мой полный код:
UserList.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<System.Web.Security.MembershipUserCollection>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
UserList
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>UserList</h2>
<table>
<tr>
<th>User Name</th>
<th>Last Activity date</th>
<th>Locked Out</th>
</tr>
<%foreach (MembershipUser user in Model){ %>
<tr>
<td><%: Html.RouteLink(user.UserName, "AdminPassword", new { controller="StoreManager", action="changeUserPassword", username = user.UserName }) %></td>
<td><%: user.LastActivityDate %></td>
<td><%: user.IsLockedOut %></td>
</tr>
<% }%>
</table>
</asp:Content>
changeUserPassword.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<musicStoreMVC.ViewModels.ResetPasswordAdmin>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
changeUserPassword
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Change Password: <%: ViewData["username"] %></h2>
<% using (Html.BeginForm()) {%>
<%: Html.ValidationSummary(true) %>
<fieldset>
<legend>Fields</legend>
<div class="editor-label">
<%: Html.Hidden("username",ViewData["username"]) %>
<%: Html.LabelFor(model => model.password) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.password) %>
<%: Html.ValidationMessageFor(model => model.password) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.confirmPassword) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.confirmPassword) %>
<%: Html.ValidationMessageFor(model => model.confirmPassword) %>
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<% } %>
<div>
<%: Html.ActionLink("Back to List", "Index") %>
</div>
</asp:Content>
Мои действия
public ActionResult UserList()
{
var users = Membership.GetAllUsers();
return View(users);
}
public ActionResult changeUserPassword(string username)
{
ViewData["username"] = username;
return View();
}