MVC 3.0 で自分のコードに関係のある問題に遭遇しましたが、会社を辞めたばかりの誰かのコードを変更していて、私には理解できない何かを台無しにしてしまったようです。次のようなコントローラーがあります。
直属の部下
/// <summary>
/// Gets currently logged in user's direct reports nominees
/// </summary>
/// <returns></returns>
[HttpGet]
public ViewResult DirectReportNominees()
{
this.nominationRepository = new NominationRowsRepository("Data Source=" + MvcApplication.SERVER_NAME + "; Initial Catalog=Cinet;Integrated Security=True",
_currentuser.SAMAccountName);
return View(nominationRepository.GetDirectReportNominees);
}
/// <summary>
/// Overload that triggers when supervisor clicks
/// Approve or Reject on Direct Report page
/// </summary>
/// <param name="submitButton"> button triggered to accept or Reject nomination</param>
/// <param name="NominationID">ID of nomination to change status of</param>
/// <returns></returns>
[HttpPost]
public ViewResult DirectReportNominees(string submitButton, string NominationID)
{
this.nominationRepository = new NominationRowsRepository("Data Source=" + MvcApplication.SERVER_NAME + "; Initial Catalog=Cinet;Integrated Security=True",
_currentuser.SAMAccountName);
switch (submitButton)
{
case "Accept":
NominationRow nomination = nominationRepository.GetNomination(NominationID);
Employee nominatedUser = _adRepository.GetDirectoryUserInfo(nomination.NomineeLogin);
// the email is sent from inside the repository
nominationRepository.AcceptNomination(NominationID, nominatedUser);
break;
case "Reject":
nominationRepository.RejectNomination(NominationID);
break;
default:
break;
}
NominationID = "";
return View(nominationRepository.GetDirectReportNominees);
}
コントローラーは、データベース クラスから収集します。特定のログイン ユーザーに関連するさまざまな指定が、以下のビューに報告され、送信されます。
ビューは次のようになります。
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<CINet.Areas.CAP.Models.CapDomain.Repositories.NominationStruct>>" %>
<asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server">
<%--<%: CINet.Views.Helpers.CssHelper.Css(Html, "~/Areas/CAP/Styles/Cap.css") %>--%>
<link rel="Stylesheet" type="text/css" href="<%: Url.Content("~/Areas/CAP/Styles/Cap.css") %>" />
</asp:Content>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<div id="outsidewrapper">
<div id="picture"></div>
<div id="insidewrapper">
<div id="navcontainer">
<% Html.RenderAction("Navigation", "Cap"); %>
</div>
<div id="CapsDashboard">
<h3>Direct Report Nominees</h3>
<table>
<colgroup>
<col id="nominee" />
<col id="nominatedBy" />
<col id="reason" />
<col id="status" />
</colgroup>
<thead>
<th scope="col">Name</th>
<th scope="col">Nominated By</th>
<th scope="col">Reason</th>
<th scope="col">Status</th>
<th></th>
</thead>
<tbody>
<% foreach (var nomination in Model) { %>
<tr>
<td><%: nomination.NomineeLogin %></td>
<td><%: nomination.NominatedBy %></td>
<td><%: nomination.NominationReason %></td>
<td><%: nomination.NominationStatus %></td>
<td>
<% if (nomination.NominationStatus == "Pending")
{ %>
<%--Create Accept Button--%>
<% Html.BeginForm("DirectReportNominees", "Cap", FormMethod.Post); %>
<%: Html.Hidden("NominationID", nomination.NominationID.ToString()) %>
<input type="submit" name="submitButton" value="Accept" />
<% Html.EndForm(); %>
<%--Create Reject Button--%>
<% Html.BeginForm("DirectReportNominees", "Cap", FormMethod.Post); %>
<%: Html.Hidden("NominationID", nomination.NominationID.ToString()) %>
<input type="submit" name="submitButton" value="Reject" />
<% Html.EndForm(); %>
<% } %>
</td>
</tr>
<%--</div>--%>
<% } %>
</tbody>
</table>
</div>
</div>
</div>
</asp:Content>
明らかに、これは SiteMaster 内にカプセル化されています。ビューはモデルを取り込み、拒否および承認ボタンとともに指名されたユーザーに関するさまざまな情報を吐き出します。このボタンの値は、ユーザーが実行したい特定のものに設定する必要があります。また、非表示の入力フィールドがあり、その値はデータベースを介して受信した指名 GUID です。最初のラウンドはうまく機能しますが、それが完了した後、ビューが HttpPost から戻ると、すべての非表示の値が同じ値 (GUID) になります。値は、承認/拒否されたばかりの GUID または行と常に同じになることもあります。この価値を保持している可能性のあるものについてのアイデアはありますか? プログラマーが使用した ViewData はなく、ビューにエラーはありませんか? ビューをステップスルーしようとしました ' 投稿が返され、それらがすべて異なる場合の foreach ループですが、ブラウザーに到達するまでに、それらはすべて同じ値になりますか?? 非常に奇妙で、ポイントを特定するのが困難です。
助言がありますか??
ビューが取得するクラスは次のとおりです。
public class NominationStruct
{
public string NominationID; // unique ID in DB
public string NomineeLogin;
public string NominationReason;
public string NominationReasonWithBreaks;
public string NominatedBy;
public string NominationStatus;
}
モデルは次のとおりです。
public class NominationsListViewModel
{
public IList<NominationRow> NominationRows { get; set; }
public string CurrentTab { get; set; }
}