Я создал родительский и частичный вид. Я делаю вызов ajax (используя функцию $.load()
), чтобы вызвать мой метод RacesName()
, чтобы получить значение, связанное с атрибутом data-raceid
моих кнопок. Затем я хочу обновить текст, сгенерированный @ViewBag.Name
, с этим значением.
Я получаю следующую ошибку
GET
http://localhost:53987/Races/RacesName?id=103646584
500 (Internal Server Error)
Модель
public class clsStakes
{
public string Date { get; set; }
public int? RaceId { get; set; }
public string Race { get; set; }
}
Контроллер
[HttpGet]
public ActionResult Stakes(ClsStakes clsStakes)
{
return View(clsStakes);//return parent view
}
public ActionResult RacesName(ClsStakes clsStakes, int? id)
{
RacesDetails racesDetails = new RacesDetails();
ViewBag.Name = racesDetails.RaceName(id);
return View(clsStakes); // I think this part is creating problem.
}
Родительский вид
<div class = "container">
@ViewBag.Name
<div id = "mypartial"></div>
</div>
Частичное представление (отображается в элементе <div id = "mypartial">
основного представления с помощью отдельного рабочего вызова ajax)
<table class = "table">
<tr>
<th>@Html.DisplayNameFor(m => m.Date)</th>
<th>@Html.DisplayNameFor(m => m.Race)</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>@Html.DisplayFor(modelItem => item.Date)</td>
<td>
<button class = "linkClass" type = "button" data-raceid = "@item.RaceId">@Html.DisplayFor(modelItem => item.Race)</button>
</td>
</tr>
}
</table>
Скрипт для получения raceid
$('#mypartial').on('click', '.linkClass', function () {
var race = $(this).data("raceid");
var raceid = '@Url.Action("RacesName", "Stakes")?id=' + race;
$(this).load(raceid);
});
Наконец, процедура получения названия гонки
public string RaceName(int? Id)
{
SqlParameter[] prms = new SqlParameter[1];
string sSQL;
var RaceName = "";
sSQL = "exec StakesRacesGetRaceDetails @Id";
prms[0] = new SqlParameter("@Id", SqlDbType.Int);
prms[0].Value = Id;
ds = clsUtilities.CreateCommandwithParams(sSQL, prms);
DataTable dataTable = ds.Tables[0];
if (dataTable.Rows.Count>0)
{
DataRow row = dataTable.Rows[0];
RaceName = Convert.ToString(row["race_header"]);
}
return RaceName;
}
У вас метод RacesName()
не имеет смысла. Сначала вы используете функцию .load()
, которая ожидает HTML (View
, а не json). Во-вторых, вы устанавливаете значение ViewBag
, но оно просто игнорируется, когда вы возвращаете JsonResult
. Неясно, что вы хотите, когда вы выполняете вызов ajax
Теперь вы возвращаете View
- у вас есть представление с именем RacesName.cshtml
?
@RoryMcCrossan, на самом деле, поскольку для public ActionResult RacesName(ClsStakes clsStakes, int? id)
нет просмотра, я получаю эту ошибку. Но если я изменю тип возвращаемого значения на Json
, тогда все частичные значения будут заменены этим значением Json. Пожалуйста, предложите мне, как вернуть единственную строку, которую я могу передать в родительский вид.
Является ли единственная строка, которую вы имеете в виду, значением racesDetails.RaceName(id);
? Итак, что вы хотите с этим делать (какую часть DOM вы хотите обновить)?
@StephenMuecke, нет представления с именем RacesName.cshtml
. На самом деле, я хочу получить имя гонки из процедуры и отобразить в родительском представлении. Я пробовал таким способом, который не дает мне решения. Пожалуйста, направь меня.
Вам нужно ответить на мои вопросы
@StephenMuecke, да я имею в виду racesDetails.RaceName(id);
. На самом деле, я хочу отобразить имя расы, как вы видите в моем родительском представлении. Для этого я использовал ViewBag.
Позвольте нам продолжить обсуждение в чате.
500 (Internal Server Error)
означает, что ваш метод контроллера вызывает исключение. Вы можете использовать инструменты браузера (вкладка «Сеть»), чтобы проверить результат вашего вызова ajax, который покажет детали исключения. В этом случае, как указано в комментариях, у вас нет представления с именем RacesName.cshtml
.
Один из вариантов - создать частичное представление с именем (скажем) _RacesName.cshtml
, которое содержит только
@ViewBag.Name
и тогда метод контроллера будет
public ActionResult RacesName(int? id)
{
RacesDetails racesDetails = new RacesDetails();
ViewBag.Name = racesDetails.RaceName(id);
return PartialView("_RacesName");
}
и измените основной вид на
<div class = "container">
<div id = "racename">@ViewBag.Name</div> // add container element
<div id = "mypartial"> </div>
</div>
и сценарий к
$('#mypartial').on('click', '.linkClass', function () {
var race = $(this).data("raceid");
var url = '@Url.Action("RacesName", "Stakes")?id=' + race;
$('#racename').load(url);
});
В качестве альтернативы вы можете просто вернуть JsonResult
и обновить DOM.
Измените контроллер на
public ActionResult RacesName(int? id)
{
RacesDetails racesDetails = new RacesDetails();
string raceName = racesDetails.RaceName(id);
return JsonResult(raceName, JsonRequestBehavior.AllowGet);
}
И сценарий к
$('#mypartial').on('click', '.linkClass', function () {
var race = $(this).data("raceid");
var url = '@Url.Action("RacesName", "Stakes")';
$.getJSON(url, { id: race }, function(response) {
$('#racename').text(response);
});
});
Большое вам спасибо. Это простое и лучшее решение моей проблемы.
В качестве побочного примечания, поскольку ваша модель уже содержит свойство с именем RaceName
, почему бы просто не добавить это значение в вашу кнопку в качестве атрибута data-racename = "@item.RaceName
, а затем использовать его вместо вызова ajax?
Извините, по ошибке в модель добавлен RaceName
. Я сниму его оттуда.
Ошибка 500 означает, что проблема в вашей логике C# на сервере. Я предлагаю вам установить точку останова и перейти к ней после вызова AJAX. Блок try / catch также будет хорошей идеей