MVC3 с использованием CheckBox со сложной моделью представления - PullRequest
1 голос
/ 15 апреля 2011

Правильно, ребята.Мне нужны ваши мозги, так как я не могу найти способ сделать это правильно.

У меня есть модель представления:

public class EditUserViewModel
{
    public User User;
    public IQueryable<ServiceLicense> ServiceLicenses;
}

Пользователь не важен, поскольку я знаю, как с этим справиться.

ServiceLicenses имеет следующую реализацию:

public class ServiceLicense
{
    public Guid ServiceId { get; set; }
    public string ServiceName { get; set; }
    public bool GotLic { get; set; }
}

Получение проверенного списка пользователей - это круто.Это работает как шарм.

<fieldset>
    <legend>Licenses</legend>
    @foreach (var service in Model.ServiceLicenses)
    {     
    <p>
        @Html.CheckBoxFor(x => service.GotLic)
        @service.ServiceName
    </p>
    } 
</fieldset>

Проблема, с которой я столкнулся, заключается в получении обновленного объекта ServiceLicenses с новыми проверенными сервисами обратно в HttpPost в моем контроллере.Для простоты, скажем, это выглядит так:

    [HttpPost]
    public ActionResult EditUser(Guid id, FormCollection collection)
    {

        var userModel = new EditUserViewModel(id);
        if (TryUpdateModel(userModel))
        {
            //This is fine and I know what to do with this
            var editUser = userModel.User;

            //This does not update
            var serviceLicenses = userModel.ServiceLicenses;

            return RedirectToAction("Details", new { id = editUser.ClientId });
        }
        else
        {
            return View(userModel);
        }
    }

Я знаю, что использую CheckBox неправильно.Что мне нужно изменить, чтобы заставить serviceLicenses обновляться с установленными флажками в форме?

1 Ответ

2 голосов
/ 15 апреля 2011

Я понимаю, что свойство ServiceLicenses является коллекцией, и вы хотите, чтобы связыватель MVC связывал его с вашим свойством параметров действия.для этого у вас должны быть индексы, прикрепленные к входным данным, например,

<input type="checkbox" name = "ServiceLicenses[0].GotLic" value="true"/>
<input type="checkbox" name = "ServiceLicenses[1].GotLic" value="true"/>
<input type="checkbox" name = "ServiceLicenses[2].GotLic" value="true"/>

Префикс может быть не обязательным, но он очень удобен при привязке свойства коллекции параметра метода действия.для этой цели я бы предложил использовать цикл for вместо foreach и использовать помощник Html.CheckBox вместо Html.CheckBoxFor

<fieldset>
    <legend>Licenses</legend>
    @for (int i=0;i<Model.ServiceLicenses.Count;i++)
    {     
    <p>
        @Html.CheckBox("ServiceLicenses["+i+"].GotLic",ServiceLicenses[i].GotLic)
        @Html.CheckBox("ServiceLicenses["+i+"].ServiceName",ServiceLicenses[i].ServiceName)//you would want to bind name of service in case model is invalid you can pass on same model to view
        @service.ServiceName
    </p>
    } 
</fieldset>

. Не использовать строго типизированный помощник здесь просто личное предпочтение.если вы не хотите индексировать свои входные данные, как это, вы также можете взглянуть на этот замечательный пост от steve senderson

Редактировать: у меня есть в блоге о создании главной формы детализации на asp.net mvc3, что также актуально в случае привязки списка.

...