2015-12-18 2 views
2

У меня есть приложение ASP.net с [HttpGet] для просмотра ActionResult под названием «Create» на контроллере под названием Studentsсообщения модели к MVC ActionResult

Мой «Student», затем отправило к следующему контроллеру.

[HttpPost] 
public async Task<ActionResult> Create(Student student) 
{ 
    Student.Add(student); 
    if (ModelState.IsValid) 
    { 
     var result = db.Students.Add(student); 
     await db.SaveChangesAsync(); 
     return Details(result); 
    } 
    return View(new CreateStudent()); 
} 

return Details(result); это линия меня интересует.

Раньше я был RedirectToAction, где я прошел в результате. Id и использовали запрос GET для запроса базы данных.

Но я не хотел бы иметь URL, как «студенты/подробности/ид = 123» или «студентов/подробности/123» Я хочу Post моей модели к контроллеру «студенты/подробности»

результат вар является единственным «Student'and мой„Детали“ActionResult выглядит следующим образом:

[HttpPost] 
public async Task<ActionResult> Details(Student student) 
{ 
    // 
} 

но return Details(result); не работает, я получаю сообщение об ошибке:

'Элемент модели, переданный в словарь, имеет тип' LinkApp.Models.Student ', но для этого словаря требуется элемент модели типа' LinkApp.Models.DTOs.CreateStudent '.'

Но я считаю, что это потому, что мой URL никогда не идет на «/ Студенты/Детали», мой URL-прежнему показывает «/ Студенты/Создать»

Любая помощь приветствуется. И опять же, если это не ясно, пожалуйста, обратитесь к любой ясности

Благодаря

EDIT БЛАГОДАРЯ МНЕ НЕ БЫТЬ ОЧЕНЬ ОЧИСТИТЬ;)

+2

Как насчет возврата («Детали», результат); ? Разве это не работает? –

+2

Это все еще не совсем ясно, что вы пытаетесь сделать. –

+0

Ваш вопрос зависит от метода действий «Подробнее», который не помещается в ваш код! –

ответ

1

Так что я немного запутался, что вы» пытаюсь добиться.

Вот что я собрал: Вы хотите POST данных. Сейчас у вас есть метод GET. Вы можете придумать метод GET как что-то, что извлекает, и POST как нечто, что дает.

Так что ваш метод GET не должен пытаться POST ничего.

Ваш метод GET должен выглядеть это должно быть POST, так как вы пытаетесь «дать» данные на что-то, не получить данных.

[HttpPost] 
public async Task<ActionResult> Create(Student student) 
    { 
     Student.Add(student); 
     if (ModelState.IsValid) 
     { 
      var result = db.Students.Add(student); 
      await db.SaveChangesAsync(); 

      return View("Details", result); 
     } 

     return View(); //You should add a property to the model called ErrorMessage or something like that, then you could do student.ErrorMessage = "Model state was not valid";, then you could do return View(student); and in the view you could do something like @if (Model.ErrorMessage != null) { @Html.DisplayFor(m=>m.ErrorMessage); } 
    } 

Это то, что ваш пост должен выглядеть, вы экономите на Student модели в базу данных и вернуться к просмотру.

Теперь ваши GET должны просто быть что-то вроде этого:

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

Edit:

Если вы хотите свой пост, чтобы сделать сообщение об ошибке я оставил в комментарии выше вы бы просто сделать это прямо над вторым return View();

student.ErrorMessage = "Model state was not valid;" //Or whatever you want to say 
return View(student); 

Затем на ваш взгляд, вы Wou ld есть что-то вроде этого:

@if (student.ErrorMessage != null) 
{ 
@Html.DisplayFor(m => m.ErrorMessage); 
} 
+0

@maxshuty ... Я не верю, что я ясно дал понять, что проблема не связана с любыми ошибками ModelState, просто пытается передать модель другому ActionResult – James

+1

@thomo Я просто добавил, что ошибки потому что это хорошая практика, чтобы сообщить вашему пользователю об ошибке. Вы можете игнорировать эту часть. – maxshuty

+0

Спасибо maxshuty. Я упомянул в комментарии выше (только сейчас), что я попытался вернуть View («Подробности», результат); это, но URL-адрес остается на «students/create». Вы абсолютно правы в обработке ошибок, спасибо, в моем списке задач! Спасибо :) – James

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