2016-10-05 3 views
0

У меня есть контроллер с именем StudentController, Index.cshtml и центральный layout.cschtml,Как перенаправить вид на другое действие на том же контроллере

Я делаю развитие переднего конца после очень долгого времени и работает на интерфейсе на asp.net mvc сейчас тихо для меня, поэтому, пожалуйста, простите меня, если что-то не так.

То, что я пытаюсь добиться в том, что, когда я бегу мое приложение это прекрасно работает найти, но когда я нажимаю ссылку Student успешно идет в индексном Student и нажмите Индексный метод в StudentController.

Но когда я нажимаю на ссылку Создать новый в представлении Index, то он дает ошибку (см внизу), может кто-то руководство, что я делаю неправильно ....

StudentController

public StudentController(){} 
public ActionResult Index() 
{    
    var students =_studentDb.GetAll();    
    return View(students); 
} 

[HttpPost] 
public ActionResult Create(Student student) 
{ 
    var result = _studentDb.Insert(student); 
    return View("Create"); 
} 

_layout.chtml

<ul class="nav navbar-nav"> 
        <li>@Html.ActionLink("Home", "Index", new { Controller = "Home", Area = "Common" })</li>      
        <li>@Html.ActionLink("Student", "Index", new { Controller = "Student", Area = "User" })</li> 
        <li>@Html.ActionLink("New Student", "Index", new { Controller = "CreateStudent", Area = "User" })</li> 
       </ul> 

Index.chtml

@model IEnumerable<Student> 

@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Index</h2> 

<p> 
    @Html.ActionLink("Create New", "Create",new {Controller="Student",Area="User" })   
</p> 
<table class="table"> 
    <tr>   
     <th> 
      @Html.DisplayNameFor(model => model.FirstName) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.MiddleName) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.LastName) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Gender) 
     </th>   
     <th> 
      @Html.DisplayNameFor(model => model.FirstNameAr) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.MiddleNameAr) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.LastNameAr) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr>   
     <td> 
      @Html.DisplayFor(modelItem => item.FirstName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.MiddleName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.LastName) 
     </td>   
     <td> 
      @Html.DisplayFor(modelItem => item.FirstNameAr) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.MiddleNameAr) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.LastNameAr) 
     </td> 
     <td> 
      @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) | 
      @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) | 
      @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ }) 
     </td> 
    </tr> 
} 

</table> 

Ошибка

Server Error in '/' Application. 

The resource cannot be found. 

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly. 

Requested URL: /User/Student/Create 

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.6.1055.0 
+1

У вас есть вид под названием «Создать»? –

+3

Проблема в том, что вы пытаетесь «ПОЛУЧИТЬ» метод «POST». У вас есть действие '[HttpPost]' под названием Create - это то, к чему вы бы ПОСТ, чтобы создать ученика. Вам также нужен метод '[HttpGet]' Create, который является формой для ввода пользователем. – markpsmith

+0

@PaulKaram, да У меня есть представление под названием Create – Shax

ответ

1

Сначала вам нужно два метода на вашем контроллере, один для GET и один для POST. У вас есть только POST.

GET вернет Create View, который у вас есть, поэтому измените атрибут HttpPost.

[HttpGet] 
public ActionResult Create() 
{ 
    return View("Create"); 
} 

Если вы хотите, чтобы контроллер действий A для возврата контроллера Действие B, обратный RedirectToAction() вместо View()

+0

Метод GET не должен вставлять ученика в базу данных (избавиться от первой строки) –

+0

Спасибо, espCoder, он работал красиво – Shax

+0

Спасибо за ловушку @mark. Я обновил ответ. – espCoder

2

Вы получаете сообщение об ошибке, потому что вы генерируя <a> тег к сообщению действия. Вы можете получать доступ только к сообщениям через сообщение формы или ajax в javascript. Если вы пытаетесь установить ссылку на другой вид, вы должны удалить атрибут [HttpPost]. Кроме того, кажется, что вы хотите передать свой result в свой вид Create, например: return View(result) (используя эту перегрузку, потому что ваше представление имеет то же имя, что и ваше действие). Кроме того, ваше действие Create имеет параметр Student, но вы не передаете ему значения. Я бы рекомендовал структуру более как следующее:

public IActionResult Create() 
{ 
    var student = new Student(); 
    return View(student) 
} 

[HttpPost] 
public IActionResult Create(Student student) 
{ 
    _studentDb.Add(student); 
    _studentDb.SaveChanges(); 
    // Do whatever you like to finish this action 
} 

И тогда вашим Создать представление должны содержать форму для ввода данных о студенте, который публикует/User/Student/Создать.

2

код изменения, как этот

public ActionResult Create() 
{ return View(); } 

[HttpPost] 
public ActionResult Create(Student student) 
{ 
    var result = _studentDb.Insert(student); 
    return View(); 
} 
1

Вообще нужны два действия:

  1. a GET действие, показывающее экран, на котором пользователь вводит оценку необходимых для создания нового объекта.Это будет иметь форму, который при представлении идет к ...
  2. действия
  3. POST, который принимает форму представление, проверяет анти-подделка маркеров, и делает фактические манипуляции с данными (добавляет пользователя в базу данных) , Еще лучше практика является то Перенаправление на GET действия (например, RedirectToAction назад к действию Index ), чтобы избежать двойного размещения (https://en.wikipedia.org/wiki/Post/Redirect/Get)

У вас есть только действие POST ... вы не можете ссылку на это, вам необходимо представить его как форму. Поэтому вам нужно также создать действие GET.

+0

понял ваши комментарии – Shax

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