@ Html.Partial в Ajax.BeginForm не публикует данные для действия - PullRequest
1 голос
/ 14 сентября 2011

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

<div id="mydiv">
    @using (Ajax.BeginForm("Index1", "Home", new AjaxOptions { UpdateTargetId = "mydiv", InsertionMode = InsertionMode.Replace, HttpMethod = "Post" }))
    {        
        //Does not send data to action on post  
        @Html.Partial("ViewUserControl1",Model.Emps)
        //ViewUserControl1 contains the same next 8 line logic.
        OR

        //Send the data to actions on post.
        for (int i = 0; i < Model.Emps.Count(); i++)
        {
            @Html.TextBoxFor(x => x.Emps[i].Name)
            @Html.TextBoxFor(x => x.Emps[i].Address)
            @Html.ValidationMessageFor(x => x.Emps[i].BBString)
        <br />    
        }

        <input id="dosomething" type="submit" value="save" />
    }
</div>


///On Controller 
   [HttpPost]
   public ActionResult Index1(MyModel model)
   {
      ///Here i am looking for the model data which is null for partial.
      return View(model);
   }

Где MyModel имеет список Emps {имя, адрес}

Кто-нибудь знает причину этого?

Ответы [ 2 ]

2 голосов
/ 14 сентября 2011

Я подозреваю, что ваш ViewUserControl1 частичный выглядит следующим образом (вы не показали его, вы только что сказали, что он выглядит как следующие 8 строк, но, очевидно, он не выглядит эти 8 строк, потому что он использует другое представлениемодель):

@model IEnumerable<Employee>

for (int i = 0; i < Model.Count(); i++)
{
    @Html.TextBoxFor(x => x[i].Name)
    @Html.TextBoxFor(x => x[i].Address)
    @Html.ValidationMessageFor(x => x[i].BBString)
    <br />    
}

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

Я бы порекомендовал использовать шаблоны редактора вместо частичных представлений, например:

<div id="mydiv">
    @using (Ajax.BeginForm("Index1", "Home", new AjaxOptions { UpdateTargetId = "mydiv", InsertionMode = InsertionMode.Replace, HttpMethod = "Post" }))
    {        
        @Html.EditorFor(x => x.Emps)
        <input id="dosomething" type="submit" value="save" />
    }
</div>

, а затем внутри ~/Views/SomeControllerName/EditorTemplates/Employee.cshtml просто:

@model Employee
@Html.TextBoxFor(x => x.Name)
@Html.TextBoxFor(x => x.Address)
@Html.ValidationMessageFor(x => x.BBString)
<br/>

Шаблон редактора будет отображаться для каждого элемента коллекции Emps, поэтому вам не нужно писать циклы.Он сгенерирует собственные имена для полей ввода, чтобы механизм связывания модели по умолчанию мог заполнять значения при обратной передаче.Расположение шаблона редактора очень важно.Он должен быть помещен либо внутри ~/Views/Shared/EditorTemplates (если вы хотите, чтобы он использовался повторно между несколькими контроллерами), либо внутри ~/Views/SomeControllerName/EditorTemplates (если вы хотите, чтобы он был повторно использован только между представлениями данного контроллера).Название шаблона также важно.Он должен называться так же, как тип коллекции.Например, если у вас есть свойство public IEnumerable<Employee> Emps { get; set; } в модели представления, шаблон должен называться Employee.cshtml, чтобы он автоматически отображался для каждого элемента этой коллекции.

0 голосов
/ 14 сентября 2011

Это хорошая статья, которую я нашел при поиске

http://lostechies.com/jimmybogard/2011/09/07/building-forms-for-deep-view-model-graphs-in-asp-net-mvc/

...