2015-05-19 4 views
0

У меня есть форма C#, которая использует ViewModel. Get функция вызывает мнение так:Сохраните поля формы после неудачной проверки с помощью ViewModel

return View(viewmodel); 

В моем Post функции, я проверяющие поля формы, а затем использовать это, чтобы вернуться к просмотру:

if (!ModelState.IsValid) 
{ 
    ViewData["wo_id"] = wo_id; 
    var viewmodel = new AEO.WorkOrder.Domain.ViewModels.WorkOrderDetailsViewModel(wo_id); 
    viewmodel.GetWOIMDetails(); 
    return View(viewmodel); 
} 

Проблема в том случае, если форма не проходит проверку, обновленная страница возвращается со всеми полями пустым. Как сохранить информацию в этих полях при обновлении?

Edit: Вот вид

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<AEO.WorkOrder.Domain.ViewModels.WorkOrderDetailsViewModel>" %> 

<%= Html.ValidationSummary() %> 
<% Html.BeginForm("InternationalTransportationAddDetails","InternationalMove", FormMethod.Post); %> 
<input id="comments" type="text" name="comments"/><%= Html.ValidationMessage("Comments", "*") %> 
<input type="submit" value="Submit New Details" id="submit" name="submit" /> <br /> 
<input type="hidden" value="<%= ViewData["wo_id"] %>" id="wo_id" name="wo_id" /> <br /> 
+0

Вы пытались прокомментировать две строки выше 'вернуться View (ViewModel)' в вашем почтовом метод действия контроллера? – ekad

+0

Добавьте свой код в файл вида – iamawebgeek

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

1

В вашем после действия, вы возвращаете новый экземпляр ViewModel, а не пост-модель. пример того, как это должно выглядеть:

[HttpPost] 
public ActionResult InternationalTransportationAddDetails(WorkOrderDetailsViewModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
    ViewData["wo_id"] = wo_id; // however you get wo_id 

    return View(model); 
    } 

    // if valid, process model here 
} 

Посмотрите, как я вернул опубликованную модель? Теперь, если значения вашей формы не соответствуют вашей ViewModel, то вам придется создать новый экземпляр вашего ViewModel, но также включают в себя ценности пост-модели в рамках ViewModel:

[HttpPost] 
public ActionResult InternationalTransportationAddDetails(SomeModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
    ViewData["wo_id"] = wo_id; 
    var viewmodel = new AEO.WorkOrder.Domain.ViewModels.WorkOrderDetailsViewModel(wo_id); 
    viewmodel.comments = model.Comments; 
    return View(viewmodel); 
    } 

Так что в этом Например, мы взяли модель нашей формы, и если проверка не удалась, мы применим свойство из этой модели к нашей модели представления, а затем вернем модель представления. // если это действительно, модель процесса здесь }

+0

Я думаю, что это правильно, и оно подпадает под второй пример. Поле комментариев на самом деле не находится в модели представления, так как я просто обрабатывал его вручную. Есть ли способ обойти перемещение всех данных в модель представления? –

+1

Возможно, вам захочется создать пользовательскую пост-модель, специально предназначенную для полей вашей формы, а затем сделать эту модель свойством ViewModel. Когда вы отправляете свою форму, вы можете просто принять свою пользовательскую модель в post-action, но если проверка не выполняется, и вам нужно вернуть модель просмотра, вы можете назначить настраиваемую модель для ViewModel. – Eckert

+0

Отлично, спасибо! –

1

Для генерации входных данных формы вам необходимо использовать методы HtmlHelper, чтобы они правильно отображали запрошенные значения.

Html.TextBoxFor(vm => vm.Comments) 

или

Html.TextBox("Comments") 
Смежные вопросы