2014-09-14 1 views
0

У меня есть модель:Как сделать пользовательские модели подшивки в C# MVC

public class MyModel 
{  
    public MyModel (int ID, string Name) 
    { 
     this.ID = ID; 
     this.Name= Name;    
    }  

    public int ID { get; set; } 
    public string Name{ get; set; } 
} 

В моем контроллере, я придаю значение этой модели. Это список предметов, которые я хочу показать в представлении.

public ActionResult Create() 
{  
    IEnumerable<MyModel> myModel = from q in tbl1.AsEnumerable() 
     select new MyModel (q.ID, q.Name); 

    return View(myModel); 
} 

Это мое мнение:

При нажатии на кнопку Submit, я хочу передать данные MyModel к контроллеру. Но это всегда значение null.

Я думаю, мне нужно BindModel и написать что-нибудь в protected void Application_Start() функция. Но я не знаю, как это сделать.

+0

То, что у вас есть, не является «настраиваемой» моделью. Такую модель не существует. Все модели определены пользователем. Кроме того, для привязки к списку вам не требуется настраиваемое связующее устройство. Этот вопрос уже был задан слишком много раз на SO. Проверьте это: http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx – ataravati

ответ

1

Две проблемы.

MyModel не имеет конструктора без параметров. DefaultModelBinder не будет работать без одного, так что добавьте один

public class MyModel 
{ 
    public MyModel() {} // add parameterless constructor 
    public MyModel (int ID, string Name) 
    { 
    this.ID = ID; 
    this.Name= Name;    
    } 
} 

В просмотре создают входы с тем же именем (и ID, который является недействительной HTML). Либо создать пользовательский EditorTemplate для MyModel и использовать @Html.EditorFor(m => m) (не в цикле Еогеасп) или изменить коллекцию IList и использовать for цикл так, что входы корректно названы с индексаторами

for (int i = 0; i < Model.Count; i++) 
{ 
    @Html.TextBoxFor(m => m[0].Name) 
} 

В обоих случаях ваш HTML будет

<input type="text" name="[0].Name" ...> 
<input type="text" name="[1].Name" ...> 
... 

, который будет правильно связываться с

[HttpPost] 
public ActionResult Create(IEnumerable<MyModel> myCollection) 
{ 
+0

Этот ответ неверный. Для цикла не имеет никакого смысла. – ataravati

+0

@ataravati, что вы имеете в виду, это не имеет смысла - создание текстового поля для каждого свойства 'Name'' MyModel' в коллекции –

+0

@ataravati и BTW, я создал проект, используя вышеприведенный код с моделью OP, и это работает. Возможно, вам стоит попробовать. –

-1

Я хотел сделать ю е так, как вы хотите, прежде, но теперь я всегда с использованием объектов Modal в виду не используя Коллекция Мой путь: У меня есть пользовательские Модальные

public class MyModel 
{ 
    public IEnumerable<Item> MyItems; 
} 

public class Item 
{ 
    public int ID { get; set; } 
    public string Name{ get; set; } 
} 

И в контроллер добавить коллекцию MyModel

public ActionResult Create() 
{  
    MyModel myModel = new MyModel(); 
    myModel.MyItems = from q in tbl1.AsEnumerable() 
    select new MyModel (q.ID, q.Name); 

    return View(myModel); 
} 

Примечание в окне вы должны положить модальность, чтобы сформировать представить

@model xxx_website.Models.MyModel 
@{ 
    ViewBag.Title = "Home Page"; 
} 

@using (Html.BeginForm("Create", "Home", FormMethod.Post)) 
{ 
    for (int i = 0; i< Model.MyItems.Count; i++) 
    { 
     @Html.EditorFor(model => model.MyItems[i].Name) 
    } 
    <input type="submit" value="Submit" /> 
} 

И последний находится в контроллере у вас есть после действия

[HttpPost] 
    public ActionResult Create(MyModel modal) 
    { 
     IEnumerable<Item> myItems = modal.MyItems; // your item here 
     return View(); 
    } 

Это мой путь. Вы можете попробовать и прокомментировать здесь

+0

@ user1348351, _ "он работает" _? Это не сработает. Он отображает входы с тем же именем (которые не индексируются), поэтому свойство 'myItems' будет равно нулю при обратном вызове –

+0

да, это не работает. Как это сделать? – user1348351

+0

@StephenMuecke: Вы правы. Мой код не работает, все входы с тем же именем. Я обманываю его, используя «для» не «foreach» с моим новым кодом. Ты можешь видеть. И это работает со мной. myItems не имеет значения null при обратной передаче, и у меня есть новые данные из ввода. Спасибо –

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