2015-08-02 2 views
1

У меня есть веб-страницу со следующим HTML:MVC RedirectToAction не работает, как ожидалось

<div class="row"> 
     @Html.ActionLink("Delete Study", "DeleteStudy", "Study", new {topic = @Model.Study.PartitionKey, subtopic = @Model.Study.RowKey}, new { @class = "btn btn-primary" }) 
     @Html.ActionLink("View Studies", "StudyList", "Study", null, new { @class = "btn btn-primary" })  
    </div> 

Когда ссылка DeleteStudy нажата, следующий метод управления называется:

[Authorize] 
    public void DeleteStudy(string topic, string subtopic) 
    { 
     ... 
     ... 
     RedirectToAction("StudyList"); 
    } 

Метод DeleteStudy является и выполняется успешно, за исключением Redirect. Не происходит перенаправления. Метод StudyList (который имеет атрибут авторизации) никогда не вызывается. Я делаю что-то неправильно?

+0

Ничто в коде, показали, что это не должно работать. Однако действие Delete должно действительно быть POST, а не GET (вы не хотите, чтобы это добавилось в историю браузера или позволяло пользователю вводить его в адресную строку. В лучшем случае это просто делает ненужный вызов для удаления чего-либо, что нет дольше существует, и в худшем случае может генерировать исключение в зависимости от вашего кода) –

+0

На самом деле есть ошибка - это должно быть 'return RedirectToAction (« StudyList »);' –

+0

даже поисковые системы могут удалять ваши данные при индексировании, если не ошибаются – MstfAsan

ответ

5

Вам нужно изменить

RedirectToAction("StudyList"); 

в

return RedirectToAction("StudyList"); 

Однако я рекомендую вам сделать вашу Удалить действие на пост, а что GET. Вы не хотите, чтобы это добавлялось в историю браузера или позволяло пользователю вводить его в адресную строку. В лучшем случае это просто делает ненужный вызов, чтобы удалить то, что больше не существует, и в худшем случае может выбросить исключение в зависимости от вашего кода

@using (Html.BeginForm("DeleteStudy", "Study", new {topic = Model.Study.PartitionKey, subtopic = Model.Study.RowKey })) 
{ 
    @Html.AntiForgeryToken() 
    <input type="submit" value="Delete Study" /> // style it to look like a link if that's what you want 
} 

и изменить метод

[HttpPost] 
[Authorize] 
[ValidateAntiForgeryToken] 
public ActionResult DeleteStudy(string topic, string subtopic) 
+1

Должно быть общедоступным ActionResult DeleteStudy (...) – Andy

+0

Отредактировано, спасибо @Andy –

Смежные вопросы