Я получаю сообщение об ошибке:
Exception Details: System.InvalidOperationException: The view 'Index' or its
master was not found or no view engine supports the searched locations. The
following locations were searched:
~/Views/Request/Index.aspx
~/Views/Request/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
~/Views/Request/1819.master
~/Views/Shared/1819.master
~/Views/Request/1819.cshtml
~/Views/Request/1819.vbhtml
~/Views/Shared/1819.cshtml
~/Views/Shared/1819.vbhtml
Я видел несколько разных постов по этому поводу, но ни один из этих ответов не решил мою проблему.Я попытался просмотреть представления в visual studio, и он отправил меня к соответствующим методам.Я попытался добавить домашний контроллер с домашним видом и индексом, но это также не помогает.Я попытался изменить мой маршрут конфигурации, и это тоже не сработало.
Вот мое заявление о возврате, которое вызывает у меня проблемы:
return View("Index", requestVM.AidYear);
Я вызываю этот метод:
public ActionResult Index(string aidYear)
Я пробовал это:
return View("Index", (object)requestVM.AidYear);
и я попробовал это:
return View("Index", model:requestVM.AidYear);
С последними 2 я получаю:
System.InvalidOperationException: The model item passed into the dictionary is of type 'System.String', but this dictionary requires a model item of type 'ScholarshipDisbursement.ViewModels.Request.RequestViewModel'.
Это происходит на моей локальной машине и на нашем производственном сервере.Команда, в которой я работаю, уверена, что это сработало, когда мы ее опубликовали, потому что это довольно большая проблема, которую мы не заметили, поэтому мы не уверены, почему она больше не работает.С тех пор, как мы опубликовали это приложение, в производство не было внесено никаких изменений, поэтому мы знаем, что никто не сделал что-то, чтобы его облажать.
На всякий случай, если это поможет, вот моя конфигурация маршрута:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Request", action = "Index", id = UrlParameter.Optional }
);
}
Редактировать: На мой взгляд, у меня есть папка Запрос, и внутри этой папки есть Index.cshtml.С этой точки зрения у меня есть форма, которая подчиняется методу SubmitScholarshipRequest.Этот метод используется в контроллере запросов.
В этом методе я выполняю различные проверки и, если возникает ошибка, добавляю ее в ModelState.Если ModelState недействителен I, то:
return View("Index", requestVM.AidYear);
В противном случае I:
return RedirectToAction("Index", "Request", new { @aidYear = requestVM.AidYear });
Вот мой взгляд:
@using ScholarshipDisbursement.Helpers
@using ScholarshipDisbursement.ViewModels.Request
@model RequestViewModel
@{
ViewBag.Title = "Scholarship Request";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div class="requestIndexRoundedShadow">
<div class="pageTitleHeader">
<span><img src="~/Content/img/gradCap.ico" class="headerImg" /></span>
<span class="headerTitle"><b>Scholarship Disbursement Request</b></span>
<hr style="border-top: 1px solid black">
@using (Html.BeginForm("SubmitScholarshipRequest", "Request",
FormMethod.Post, new { id = "SubmitTutorRequestFrm" }))
{
@Html.AntiForgeryToken()
<span id="aidYearLbl" Style="font-size: 14px;font-weight: bold">Academic
Year: </span>
@Html.DropDownListFor(m => m.AidYear, new SelectList(Model.AidYears,
"Code", "Name"), new { id = "aidYear", onchange = "onChangeYear()", Style =
"font-size: 14px" })
if (Model.Scholarships.Any())
{
<br />
<br />
<table style="width: 100%;">
<tr>
<th class="headerBox tableHeader" colspan="3">Scholarships
for @Model.User.DeptName</th>
</tr>
<tr>
<th class="headerBox columnHeader" style="width:
500px;">Scholarship Name</th>
<th class="headerBox columnHeader" style="width:
100px;">Amount</th>
<th class="headerBox columnHeader" style="width:
100px;">Requested</th>
</tr>
@{ int i = 1; }
@foreach (var s in Model.Scholarships)
{
var rowColor = i % 2 == 0 ? "E8E8E8" : "ffffff";
<tr style="background-color: #@rowColor;">
<td class="rowValue">@Html.ActionLink(s.Name,
"ScholarshipRequest", "Request", new { aidYear = s.AidYear, fundCode = s.Id,
}, new { target = "_blank" })</td>
<td class="rowValue">@s.AmountTotal</td>
<td class="rowValue">@s.AmountRequested</td>
</tr>
i++;
}
</table>
<br />
<br />
if (Model.AvailScholarships.Any())
{
<table style="width: 100%">
<tr>
<th class="headerBox tableHeader" colspan="6">Request
Scholarship</th>
</tr>
<tr>
<th class="headerBox columnHeader">Scholarship</th>
<th class="headerBox columnHeader">Banner Id</th>
<th class="headerBox columnHeader">Student Name</th>
<th class="headerBox columnHeader">Amount</th>
<th class="headerBox columnHeader">Term</th>
<th class="headerBox columnHeader">Comments</th>
</tr>
<tr>
<td class="rowValue" style="width: 200px">@Html.DropDownListFor(m => m.ScholarshipId, new SelectList(Model.AvailScholarships, "Id", "Name"), "", new { id = "scholars" })</td>
<td class="rowValue" style="width: 125px">@Html.TextBoxFor(m => m.StudentId, new { autocomplete = "off", Style = "width:100%", id = "bannerId", maxlength = "9" })</td>
<td class="rowValue" style="width: 225px"><span id="studentName"></span></td>
<td class="rowValue" style="width: 50px">@Html.TextBoxFor(m => m.Amount, new { autocomplete = "off", Style = "width:100%", id = "amount", Value = "", data_val_number = " " })</td>
<td class="rowValue" style="width: 70px">@Html.DropDownListFor(m => m.Term, new SelectList(Model.Terms, "Code", "Name"), "", new { Style = "width:70px", id = "term" })</td>
<td class="rowValue" style="width: auto">@Html.TextBoxFor(m => m.Comments, new { autocomplete = "off", Style = "width:100%", id = "comments" })</td>
</tr>
<tr>
<td>@Html.ValidationMessageFor(m => m.ScholarshipId)</td>
<td>@Html.ValidationMessageFor(m => m.StudentId)</td>
<td></td>
<td>@Html.ValidationMessageFor(m => m.Amount)</td>
<td>@Html.ValidationMessageFor(m => m.Term)</td>
<td>@Html.ValidationMessageFor(m => m.Comments)</td>
</tr>
</table>
<br />
<input type="submit" id="SubmitNomineeBtn" name="SubmitNomineeBtn" class="submitButton" value="Submit" />
<span id="warning"></span>
<br />
<br />
<div class="field-validation-error">
@Html.ErrorFor(ViewData, "ExceedsAmountError")
</div>
<div class="field-validation-error">
@Html.ErrorFor(ViewData, "DuplicateEntryError")
</div>
<div class="field-validation-error">
@Html.ErrorFor(ViewData, "NullStudent")
</div>
<div class="field-validation-error">
@Html.ErrorFor(ViewData, "NegativeAmount")
</div>
}
else
{
<div style="padding-right: 100px">
<img src="~/Content/img/alert.png" /> There are currently no funds available for the @Model.User.DeptName department.
</div>
}
}
else
{
<br />
<br />
<div style="padding-right: 100px">
<img src="~/Content/img/alert.png" /> There are currently no scholarships available for the @Model.User.DeptName department.
</div>
}
}
</div>
<script>
$('#help').click(function() {
var win = $('#window').data("kendoWindow");
win.open();
win.center();
win.top();
});
$(document).ready(function () {
if ($('#bannerId').val()) {
checkBannerId();
}
});
function checkBannerId() {
var student = $('#bannerId').val();
$.ajax({
type: "POST",
url: '@Url.Action("GetStudentName","Request")',
contentType: "application/json; charset=utf-8",
data: JSON.stringify({ bannerId: student }), // parameter aNumber
dataType: "json",
success: function (msg) {
if (msg.Result === "Null Student") {
$('#studentName').html("Error finding student name");
$('#studentName').css("color", "red");
$('#bannerId').css("border-color", "red");
$('#bannerId').css("color", "red");
$('#warning').html("Invalid Banner Id.");
$('#warning').css('color', 'red');
return;
} else {
$('#bannerId').css("border-color", "unset");
$('#bannerId').css("color", "black");
$('#studentName').html(msg.Result);
$('#studentName').css('color', 'black');
$('#warning').html("");
$('#warning').css('color', 'unset');
}
},
error: function () {
}
});
}
function onChangeYear() {
window.location = '@Url.Action("Index", "Request")?aidYear=' + $("#aidYear").val();
}
$('#amount').blur(function () {
if (isNaN($('#amount').val()) || $('#amount').val() < 0) {
$('#warning').html("Invalid amount ($, commas, and negative numbers not allowed).");
$('#warning').css('color', 'red');
$('#amount').css("border-color", "red");
$('#amount').css('color', "red");
} else {
$('#amount').css("border-color", "unset");
$('#amount').css("color", "unset");
$('#warning').html("");
$('#warning').css('color', 'unset');
}
});
$('#bannerId').blur(function () {
checkBannerId();
});
</script>
Вот метод, который вызывает форма:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SubmitScholarshipRequest(RequestViewModel requestVM)
{
var scholarshipMgr = new ScholarshipStore();
var scholarship = scholarshipMgr.GetScholarship(requestVM.ScholarshipId, requestVM.AidYear);
double amountTotal = scholarship.AmountTotal;
double amountRequested = scholarship.AmountRequested;
double addTotal = amountRequested + requestVM.Amount;
string username = User.Identity.Name;
var user = new UserStore().GetUser(username);
var student = new StudentStore().GetStudent(requestVM.StudentId);
if (student == null)
{
ModelState.AddModelError("NullStudent","Unable to find Student");
}
var scholarshipRequestMgr = new ScholarshipRequestStore();
var scholarshipRequest = scholarshipRequestMgr.GetScholarshipRequest(requestVM.StudentId, requestVM.ScholarshipId, requestVM.AidYear);
if (scholarshipRequest != null)
{
ModelState.AddModelError("DuplicateEntryError", "Scholarship already requested for this student!");
}
if (addTotal > amountTotal)
{
ModelState.AddModelError("ExceedsAmountError", "Amount entered exceeds the total available!");
}
if (addTotal < 0)
{
ModelState.AddModelError("NegativeAmount", "Must be a positive number");
}
if (!ModelState.IsValid)
{
var aidYears = new AidYearStore().GetAidYears();
var scholarships = new ScholarshipStore().GetScholarships(user.DeptCode, requestVM.AidYear);
var availableScholarships = scholarships.Where(x => x.AmountTotal > x.AmountRequested);
var terms = new TermStore().GetAllTerms();
requestVM.AidYears = aidYears;
requestVM.User = user;
requestVM.Scholarships = scholarships;
requestVM.AvailScholarships = availableScholarships;
requestVM.Terms = terms;
return View("Index", requestVM.AidYear);
}
var scholarShipRequest = new ScholarshipRequest
{
AidYear = requestVM.AidYear,
ScholarshipId = requestVM.ScholarshipId,
StudentId = requestVM.StudentId,
Amount = requestVM.Amount,
TermCode = requestVM.Term,
Comments = requestVM.Comments,
DeptId = user.DeptCode,
DateCreated = DateTime.Now,
CreatedBy = username,
PIDM = new StudentStore().GetStudent(requestVM.StudentId).PIDM
};
new ScholarshipRequestStore().CreateScholarshipRequest(scholarShipRequest);
return RedirectToAction("Index", "Request", new { @aidYear = requestVM.AidYear });
}
Вот метод представления индекса из RequestController:
public ActionResult Index(string aidYear)
{
aidYear = string.IsNullOrEmpty(aidYear) ? new FinAidYear().GetCurrentYear() : aidYear;
string username = User.Identity.Name;
if (!Authorization.CheckUsernameDept(username))
return RedirectToAction("NotAuthorized", "Account");
var user = new UserStore().GetUser(username);
var aidYears = new AidYearStore().GetAidYears();
var scholarships = new ScholarshipStore().GetScholarships(user.DeptCode, aidYear);
var availableScholarships = scholarships.Where(x => x.AmountTotal > x.AmountRequested);
var terms = new TermStore().GetAllTerms();
var requestVM = new RequestViewModel
{
AidYear = aidYear,
AidYears = aidYears,
User = user,
Scholarships = scholarships,
AvailScholarships = availableScholarships,
Terms = terms
};
return View(requestVM);
}