2013-07-19 3 views
3

В настоящее время я хочу, чтобы пользователь обновил список данных и смог отправить его обратно. Данные, которые пользователь обновляет, аналогичны данным, на данный момент это несколько текстовых полей. Они обновляют информацию и отправляют ее обратно.mvc как подать viewmodel?

В настоящее время я создал следующий ViewModel

public class Name 
{ 
    public int Id { get; set; } 
    public string FullName { get; set; } 
} 

Это будет хранить данные. Так от контроллера я насмешливый данные в момент

public ActionResult Index() 
{ 

    var listOfNames = new List<Name>(); 

    var name1 = new Name(); 
    name1.Id = 1; 
    name1.FullName = "Test Name1"; 

    var name2 = new Name(); 
    name2.Id = 2; 
    name2.FullName = "Test Name2"; 

    var name3 = new Name(); 
    name3.Id = 3; 
    name3.FullName = "Test Name3"; 

    var name4 = new Name(); 
    name4.Id = 4; 
    name4.FullName = "Test Name4"; 

    listOfNames.Add(name1); 
    listOfNames.Add(name2); 
    listOfNames.Add(name3); 
    listOfNames.Add(name4); 

    return View(listOfNames); 
} 

Тогда вид выглядит следующим образом,

@model IEnumerable<MvcApplication1.Models.Name> 
@using (Html.BeginForm()) 
{ 
    foreach (var item in Model) 
    { 
     @Html.TextBox("namevalues", item.FullName, new { id = "name" + item.Id, data_id = item.Id}) 
    <br /> 
    } 

    <input type="submit" /> 
} 

, когда пользователь отправляет данные, которые я хотел бы иметь ViewModel обратно населенную, так что я должен быть в состоянии сделать следующее

[HttpPost] 
public ActionResult Index(IEnumerable<Name> names) 
{ 

    return View("index", names); 
} 

мне нужно использовать JavaScript на самом деле собирать информацию вместе ли затем передать это? или есть какая-то магия MVC, о которой я не знаю?

+0

Для этого вам не нужен JavaScript. Просто привяжите модель представления к вашему представлению. –

ответ

4

Нет вас не нужно JavaScript. Вы можете использовать модель представления, которую вы можете привязать к своему представлению. Мне не нравится передавать модели домена в представление, я предпочитаю модель представления, которая значительно уменьшена в отношении данных. Это может нравится:

public class NameListViewModel 
{ 
    public List<Name> Names { get; set; } 
} 

Теперь вам нужно заполнить список имен в контроллере, как это:

public ActionResult Index() 
{ 
    NameListViewModel viewModel = new NameListViewModel(); 
    viewModel.Names = new List<Name>(); 
    viewModel.Names.Add(new Name { Id = 1, FullName = "Test Name1" }); 
    viewModel.Names.Add(new Name { Id = 2, FullName = "Test Name2" }); 
    viewModel.Names.Add(new Name { Id = 3, FullName = "Test Name3" }); 
    viewModel.Names.Add(new Name { Id = 4, FullName = "Test Name4" }); 

    return View(viewModel); 
} 

[HttpPost] 
public ActionResult Index(NameListViewModel viewModel) 
{ 
    // All the values should still be in viewModel 
    // Do whatever you need to do 
} 

И тогда на ваш взгляд, вы можете использовать массив текстовых полей, как это:

@model YourProject.ViewModels.Names.NameListViewModel 

@for (int i = 0; i < Model.Names.Count(); i++) 
{ 
    <div> 
      @Html.TextBoxFor(x => x.Names[i].FullName) 
      @Html.HiddenFor(x => x.Names[i].FullName) 
    </div> 
} 

Попробуйте и посмотрите, не работает ли он. Измените код, чтобы он соответствовал вашему сценарию, и сделайте все, что вам нужно.

Надеюсь, это поможет.

+0

У меня тоже есть решение с минимальными изменениями. Но, можете ли вы объяснить причину, почему не 'IEnumerable'? –

+0

В этом примере я использовал 'List', потому что он имеет свойство' count'. Если мне не нужен счет, я обычно использую 'IEnumerable'. Личный выбор. Используйте то, с чем вам удобно. –

+0

Позвольте мне объяснить, что мы находимся на одной дорожке ... В вопросе OP используется «IEnumerable», и OP не может понять, почему значение View Model равно null в * Post Action Method *. можете ли вы объяснить, в чем проблема была в его коде. Я не говорю, что есть проблема в использовании List. Вместо этого я пытаюсь узнать, почему «IEnumerable» не публикует View Model. Я тоже пробовал IEnumerable в своем примере приложения и той же проблемой в конце. Я мог бы также использовать «Список» **, но это альтернатива **. –

0

Если вы используете @Html.EditorFor(x => x.FullName), свойство будет привязано к текстовому полю. Теперь это всего лишь текстовое поле с контентом.

+0

Как я могу использовать x => x.Fullname? не могли бы вы показать мне весь код? мне все еще нужно использовать цикл foreach? – user2206329

0

В вашем HTML должен быть массив текстовых полей.

Взгляните на это некоторую информацию о том, как это сделать в MVC: http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

+0

Да, я согласен с вами, вам нужно использовать массивы. Я привел несколько достойных примеров кода. –

+0

@havardhu: Почему массив и почему не 'IEnumerable'? В чем проблема с 'IEnumerable'? –

+0

@BrendanVogt: Пожалуйста, проверьте мой запрос выше. –

-1

попробуйте использовать

@Html.TextBoxFor(m => item.FullName, new { id = "name" + item.Id, data_id = item.Id });

вместо

@Html.TextBox("namevalues", item.FullName, new { id = "name" + item.Id, data_id = item.Id})

+0

. Это дает ошибку компиляции –

+0

. Я получаю сообщение об ошибке, поэтому я изменил его на @ Html.TextBoxFor (item.FullName), но он все тот же. Есть предположения? – user2206329

+0

Я прошу прощения за это, теперь я исправлю – Amol