Как передать значение lnkclass из частичного представления в хранимую процедуру в приложении mvc?

Я создал родительский и частичный вид. Я делаю вызов 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;
}

Ошибка 500 означает, что проблема в вашей логике C# на сервере. Я предлагаю вам установить точку останова и перейти к ней после вызова AJAX. Блок try / catch также будет хорошей идеей

Rory McCrossan 01.05.2018 12:44

У вас метод RacesName() не имеет смысла. Сначала вы используете функцию .load(), которая ожидает HTML (View, а не json). Во-вторых, вы устанавливаете значение ViewBag, но оно просто игнорируется, когда вы возвращаете JsonResult. Неясно, что вы хотите, когда вы выполняете вызов ajax

user3559349 01.05.2018 12:48

Теперь вы возвращаете View - у вас есть представление с именем RacesName.cshtml?

user3559349 01.05.2018 12:49

@RoryMcCrossan, на самом деле, поскольку для public ActionResult RacesName(ClsStakes clsStakes, int? id) нет просмотра, я получаю эту ошибку. Но если я изменю тип возвращаемого значения на Json, тогда все частичные значения будут заменены этим значением Json. Пожалуйста, предложите мне, как вернуть единственную строку, которую я могу передать в родительский вид.

User9895 01.05.2018 12:49

Является ли единственная строка, которую вы имеете в виду, значением racesDetails.RaceName(id);? Итак, что вы хотите с этим делать (какую часть DOM вы хотите обновить)?

user3559349 01.05.2018 12:52

@StephenMuecke, нет представления с именем RacesName.cshtml. На самом деле, я хочу получить имя гонки из процедуры и отобразить в родительском представлении. Я пробовал таким способом, который не дает мне решения. Пожалуйста, направь меня.

User9895 01.05.2018 12:53

Вам нужно ответить на мои вопросы

user3559349 01.05.2018 12:54

@StephenMuecke, да я имею в виду racesDetails.RaceName(id);. На самом деле, я хочу отобразить имя расы, как вы видите в моем родительском представлении. Для этого я использовал ViewBag.

User9895 01.05.2018 12:57

Позвольте нам продолжить обсуждение в чате.

user3559349 01.05.2018 12:59
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
1
9
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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);
    });
});

Большое вам спасибо. Это простое и лучшее решение моей проблемы.

User9895 01.05.2018 14:06

В качестве побочного примечания, поскольку ваша модель уже содержит свойство с именем RaceName, почему бы просто не добавить это значение в вашу кнопку в качестве атрибута data-racename = "@item.RaceName, а затем использовать его вместо вызова ajax?

user3559349 01.05.2018 14:09

Извините, по ошибке в модель добавлен RaceName. Я сниму его оттуда.

User9895 01.05.2018 14:21

Другие вопросы по теме